Jump to content
Diogo M

Sudoku

Recommended Posts

Diogo M

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?

Share this post


Link to post
Share on other sites
Diogo M

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?

Share this post


Link to post
Share on other sites
GaaF

isso nao pode ser bem asim pq

6 + 6 + 6 = 9

9%3 = 0

1 + 3+ 4 = 7

7%3 = 1 

soma 45 se n hover repetidos e se hover como o jogo sabe?

mas sim faz sentido pensares 1º

3x3 dps de resolvido pensa no 6*6 e por im no 9*9

Share this post


Link to post
Share on other sites
pedrotuga

mmmm qual é o problema em verificar simplesmente se existem numeros repetidos dentro de uma submatriz?

Share this post


Link to post
Share on other sites
Jully

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

Share this post


Link to post
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

×
×
  • 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.