Jump to content

Sudoku


Diogo M
 Share

Recommended Posts

Pessoal tou aqui a tentar elaborar um programa que me resolva um Sudoku. Para já já consegui fazer:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package coisasminhas;

import java.util.Scanner;

/**
*
* @author Diogo
*/
public class Sudoku {
    
public static Scanner imp = new Scanner (System.in);
    public Sudoku(){

       boolean linha = true;
       boolean coluna = true;
       boolean submatriz = true;

        int [][] matriz  = new int[9][9];
        int [][] matrizresolvida = {{9,7,8,3,2,1,6,5,4},{4,3,6,7,5,9,8,2,1},{1,2,5,4,6,8,7,9,3},{5,8,7,1,4,2,3,6,9},{6,4,9,8,3,5,1,7,2},{3,1,2,9,7,6,4,8,5},{7,9,1,2,8,3,5,4,6},{2,6,4,5,1,7,9,3,8},{8,5,3,6,9,4,2,1,7}};
        
      
        //matriz = criarMatriz();

        linha = verificaLinha(matrizresolvida);
        coluna = verificaColuna(matrizresolvida);
        submatriz = verificarSubMatriz(matrizresolvida);

        if(linha){
            System.out.println("Sucesso");
        }else{
            System.out.println("Erro");
        }

        if(coluna){
            System.out.println("Sucesso");
        }else{
            System.out.println("Erro");
        }
    }
    
    public static int [][] criarMatriz(){

          System.out.println("Sudoku\n Introduza a sua Solução por linha.");

       int [][] matriz = new int[9][9];
          for (int i = 0; i < matriz.length; i++) {
            
            for (int j = 0; j < matriz[i].length; j++) {

                System.out.println((i + 1) + "º linha - " + (j + 1) + "º Número: ");
                matriz[i][j]= imp.nextInt();

            }

        }
       
       return matriz;
    }

    public static boolean verificaLinha(int [][] matriz){
      boolean linha = true;
      int [] linhavalor = new int [9];
        for (int i = 0; i < matriz.length; i++) {

            for (int j = 0; j < matriz.length; j++) {

                linhavalor[j] = matriz[i][j];

            }

            for (int k = 0; k < linhavalor.length; k++) {

                for (int h = k+1; h < linhavalor.length; h++) {

                    if(linhavalor[k]==linhavalor[h]){
                    linha = false;
                    }

                }
            }
        }

      return linha;
    }

     public static boolean verificaColuna(int [][] matriz){
      boolean coluna = true;
      int [] colunavalor = new int [9];
        for (int i = 0; i < matriz.length; i++) {

            for (int j = 0; j < matriz.length; j++) {

                colunavalor[j] = matriz[j][i];

            }

            for (int k = 0; k < colunavalor.length; k++) {

                for (int h = k+1; h < colunavalor.length; h++) {

                    if(colunavalor[k]==colunavalor[h]){
                    coluna = false;
                    }

                }
            }
        }

      return coluna;
    }

//MAL ELABORADO PRECISO AJUDA
   /*  
     public static boolean verificarSubMatriz(int[][] matriz){
     boolean submatriz = true;
     int [] primeiralinha = new int [9];
     int [] segundalinha = new int [9];
     
     int [][] submatrizvalor = new int [3][3];
     


     for (int i = 0; i < submatrizvalor.length; i++) {
               for (int j = 0; j < submatrizvalor.length; j++) {
             
             System.out.println("("+submatrizvalor[i][j]+")");
         }
                
             }
             
             
     
     return submatriz;         
     }
    */

}

Criei um método booleano para as linhas e colunas e isso está a funcionar correctamente. O meu problema é garantir que não há dados repetidos em cada submatriz 3 x 3 do sudoku.

Como é que desenvolvo o meu método verificarSubMatriz de modo a que consiga sub dividir a matriz em 9 partes?

Link to comment
Share on other sites

Estou a pensar adoptar uma estratégia mas não sei se é a mais correcta:

- Percorrer a matriz na diagonal de 3 casas em 3 casas e de cada vez somar toda a submatriz e depois pegar na soma e verificar se soma % 3 =0

Isto é verdade se não houverem dados repetidos já que todas as sub matrizes até ai têm de ter uma soma de 45 e 45 somado a 45 vai continuar sempre, quando didivido por 3, ter resto 0.

Se avaliar a matriz com dados repetidos, ou o teste da coluna ou linha falha ou entao a soma já não vai ser divisivel por 3.

Será que isto resulta?

Link to comment
Share on other sites

Olá, utilizando um matriz (tab[9][9]) como tabuleiro, consegui realizar a verificação do quadrante, mas a parte da linha não funciona.

//* Verificando o quadrante
if((l == 0) || (l == 1) || (l == 2)){
if((c == 0) || (c == 1) || (c == 2)){
for(int j=0; j<3; j++){
for (int k=0; k<3; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
else if((c == 3) || (c == 4) || (c == 5)){
for(int j=0; j<3; j++){
for (int k=3; k<6; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
else if((c == 6) || (c == 7) || (c == 8)){
for(int j=0; j<3; j++){
for (int k=6; k<9; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
}
else if((l == 3) || (l == 4) || (l == 5)){
if((c == 0) || (c == 1) || (c == 2)){
for(int j=3; j<6; j++){
for (int k=0; k<3; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
else if((c == 3) || (c == 4) || (c == 5)){
for(int j=3; j<6; j++){
for (int k=3; k<6; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
else if((c == 6) || (c == 7) || (c == 8)){
for(int j=3; j<6; j++){
for (int k=6; k<9; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
}
else if((l == 6) || (l == 7) || (l == 8)){
if((c == 0) || (c == 1) || (c == 2)){
for(int j=6; j<9; j++){
for (int k=0; k<3; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
else if((c == 3) || (c == 4) || (c == 5)){
for(int j=6; j<9; j++){
for (int k=3; k<6; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
else if((c == 6) || (c == 7) || (c == 8)){
for(int j=6; j<9; j++){
for (int k=6; k<9; k++){
if((j != l) || (k != c)){
if(tab[l][c] == tab[j][k]){
while(tab[l][c] == tab[j][k]){
tab[l][c] = Integer.parseInt(JOptionPane.showInputDialog("O elemento informado anteriormente é igual a outro no mesmo quadrante, \ninforme um novo número para  a posição"+  (l+1)+ "X" + (c+1) +" :"));
}
}
}
}
}
}
}
Edited by apocsantos
tag code + geshi
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.