Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.77 KB | None | 0 0
  1. /**
  2.  * A classe {@code Sudoku2} tem uma possivel resolucao da 2a fase do trabalho de IP.
  3.  * Trata-se de um programa que permite ler, gerar e transformar quadriculas Sudoku.
  4.  *
  5.  * Compile: javac Sudoku2.java
  6.  * Execute: java Sudoku2
  7.  *
  8.  * @author
  9.  */
  10.  
  11. import java.util.Scanner;
  12. import java.util.Random;
  13.  
  14. class Sudoku2 {
  15.     /**
  16.      * Preenche quadricula com valores lidos atraves do leitor dado
  17.      * ligado ao teclado
  18.      * @param quadricula a quadricula sobre a qual a operacao e' efectuada
  19.      * @param leitor o canal de leitura
  20.      * @requires {@code quadricula} e' matriz 9x9
  21.      * @requires {@code leitor != null}
  22.      * @return se a operacao foi efectuada
  23.      */
  24.     static boolean leQuadricula(int[][] quadricula, Scanner leitor) {
  25.         int[][] matrizLida = leMatriz(leitor, 9, 9);
  26.         boolean valida = quadriculaValida(matrizLida);
  27.         if (valida)
  28.             copia(matrizLida, quadricula);
  29.         return valida;
  30.     }
  31.  
  32.     /**
  33.      * Copia o conteudo de uma array de arrays para outro
  34.      * @param origem array cujos valores vao ser copiados
  35.      * @param destino o array que vai receber os valores copiados
  36.      * @requires {@code origem, destino} tem as mesmas dimensoes
  37.      */
  38.     static void copia(int[][] origem, int[][] destino) {
  39.         for(int i = 0; i < origem.length; i++)
  40.             for(int j = 0; j < origem[i].length; j++)
  41.                 destino[i][j] = origem[i][j];
  42.     }
  43.  
  44.     /**
  45.      * Preenche uma quadricula com valores dados por funcao GQ
  46.      * @param quadricula a quadricula de Sudoku a preencher
  47.      * @requires {@code quadricula} e' matriz 9x9
  48.      */
  49.     static void preencheComFuncaoGQ(int[][] quadricula){
  50.         for(int i = 0; i < 9; i++)
  51.             for(int j = 0; j < 9; j++)
  52.                 quadricula[i][j] = (i / 3 + 3 * (i % 3) + j) % 9 + 1;
  53.     }
  54.     /**
  55.      * Verifica se uma matriz 9x9 e' uma quadricula Sudoku
  56.      * @param quadricula a quadricula a validar
  57.      * @requires {@code quadricula} e' matriz 9x9
  58.      * @return se quadricula e' uma quadricula Sudoku valida
  59.      */
  60.     static boolean quadriculaValida(int[][] quadricula){
  61.         //linhas ok
  62.         for (int i = 0; i < 9; i++)
  63.             if (!numeros1a9(quadricula[i]))
  64.                 return false;
  65.         //colunas ok
  66.         for (int i = 0; i < 9; i++)
  67.             if (!numeros1a9(coluna(quadricula, i)))
  68.                 return false;
  69.         //blocos ok
  70.         for (int i = 0; i < 3; i++)
  71.             for (int j = 0; j < 3; j++)
  72.                 if (!numeros1a9(bloco(quadricula, i, j)))
  73.                     return false;
  74.         return true;
  75.     }
  76.  
  77.     /**
  78.      * Obtem vetor com coluna da matriz
  79.      * @param matriz a matriz
  80.      * @param j o numero da coluna a obter
  81.      * @requires {@code matriz} e' matriz
  82.      * @requires {@code 0 <= j && j <= matriz.length }
  83.      * @return o vector contem os valores na coluna j da matriz
  84.      */
  85.     static int[] coluna(int[][] matriz, int j) {
  86.         int[] col = new int[matriz.length];
  87.         for(int i = 0; i < col.length; i++)
  88.             col[i] = matriz[i][j];
  89.         return col;
  90.     }
  91.  
  92.     /**
  93.      * Obtem vetor com bloco da matriz
  94.      * @param quadricula a quadricula
  95.      * @param l o numero da linha do bloco a obter
  96.      * @param c o numero da coluna do bloco a obter
  97.      * @requires {@code audricula} e' matriz
  98.      * @requires {@code 0 <= l,c < 3}
  99.      * @return o vector contem os valores no bloco k da quadricula
  100.      */
  101.     static int[] bloco(int[][] quadricula, int l, int c) {
  102.         int[] bloco = new int[9];
  103.         for(int i = 0; i < 3; i++)
  104.             for(int j=0; j < 3; j++)
  105.                 bloco[3*i+j] = quadricula[i+3*l][j+3*c];
  106.         return bloco;
  107.     }
  108.  
  109.     /**
  110.      * Verifica se o vector contem exatamente os valores de 1 a 9
  111.      * @param v vector a validar
  112.      * @requires {@code v != null}
  113.      * @return se o vector tem tamanho 9 e contem os valores de 1 a 9
  114.      */
  115.     static boolean numeros1a9(int[] v) {
  116.         if (v.length != 9)
  117.             return false;
  118.  
  119.         boolean[] nums = new boolean[9];
  120.         for (int x: v) {
  121.             if (x >= 1 && x <= 9)
  122.                 nums[x-1] = true;
  123.         }
  124.  
  125.         boolean result = true;
  126.         for (int i = 0; i < 9; i++)
  127.             result = result && nums[i];
  128.         return result;
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement