Estoy haciendo un programa muy simple que permite jugar una partida de Sudoku desde el principio (con el tablero vacío)
Pero al comprobar si un valor está repetido en su columna, en su fila o en su cuadro, da el error de que el número introducido esá repetido (si lo hay), pero pone igualmente el número en su casilla.
Creo que "probarG" además de ver si es o no valido un valor en G[i][j], también cambia el valor para esa casilla.
Alguien me puede ayudar.
Muchas gracias
Alex
[email protected]
No sé como enviar Terminal.class y TerminalExcepcion.class, pero Terminal.ecrire devuelve en pantalla lo que está entre paréntesis y Terminal.lire recoge lo que le usuario escribe en el teclado.
Código:
public class test {
public static void main(String[] args){
int [] [] G = new int [9] [9];
do {
int L, C, N;
String Otro;
Terminal.ecrireStringln("SUDOKU");
Terminal.ecrireStringln("Introducir las coordenadas de la casilla y el valor propuesto:");
Terminal.ecrireString("Línea: ");
L=Terminal.lireInt();
Terminal.ecrireString("Columna: ");
C=Terminal.lireInt();
Terminal.ecrireString("Valor: ");
N=Terminal.lireInt();
if (G[L-1][C-1]==0){
if (probarG(G, L, C, N) == true) //G es afectaday no debería
G[L-1][C-1]=N; //porque probarG devuelve un boolean
else //G es efectada también en le caso else
Terminal.ecrireStringln("El valor introducido no es válido");
}else
Terminal.ecrireStringln("La casilla " + L +"-" + C +" no es jugable");
Terminal.ecrireStringln(" 123 456 789");
Terminal.ecrireStringln(" +---+---+---+");
for(int i=0; i<9; i++){
Terminal.ecrireString(" "+(i+1)+" |");
for (int j=0; j<9; j++){
if (G[i][j] == 0)
Terminal.ecrireString(".");
else
Terminal.ecrireString(G[i][j]+"");
if (j==2 || j==5)
Terminal.ecrireString("|");
if (j==8)
Terminal.ecrireStringln("| "+(i+1));
}
if (i==2 || i==5 || i==8 )
Terminal.ecrireStringln(" +---+---+---+");
}
Terminal.ecrireStringln(" 123 456 789");
Terminal.ecrireStringln("");
Terminal.ecrireString("Continuar? O/N: ");
Autre = Terminal.lireString();
if (Otro.equals("N") || Otro.equals("n")){
Terminal.ecrireStringln("Adios");
break;
}
} while(true);
}
static boolean probarG (int [] [] G, int L, int C, int N){
G[L-1][C-1] = N;
int K = calculaK(L,C);
if ((linea_valida(G,L) && columna_valida(G,C) && cuadro_valido(G,K) ) == true)
return true;
else
return false;
}
static boolean linea_valida (int [] [] G, int L){
int x=0;
for (int i=0; i<8; i++){
if (G[L-1][i]==0);
else
for (int j=1; j<9; j++){
if (i==j || G[L-1][j] == 0);
else
if (G[L-1][i] != G[L-1][j]);
else
x++;
}
}
if (x!=0) return false;
else return true;
}
static boolean columna_valida (int [] [] G, int C){
int x=0;
for (int i=0; i<8; i++){
if (G[i][C-1]==0);
else{
for (int j=1; j<9; j++){
if (i==j || G[j][C-1]==0);
else
if (G[i][C-1] != G[j][C-1]);
else
x++;
}
}
}
if (x != 0) return false;
else return true;
}
static boolean cuadro_valido (int [][]G, int K){
int i=0, j=0, x=0;
switch(K){
case (1): i=0; j=0; break;
case (2): i=0; j=3; break;
case (3): i=0; j=6; break;
case (4): i=3; j=0; break;
case (5): i=3; j=3; break;
case (6): i=3; j=6; break;
case (7): i=6; j=0; break;
case (8): i=6; j=3; break;
case (9): i=6; j=6; break;
}
for (int l=0; l<3; l++){
int ii=i+l;
for (int n=0; n<3; n++){
int jj=j+n;
if (G[ii][jj]==0);
else
for(int ia=ii; ia<=i+2 ;ia++){
for(int ja=j; ja<=j+2 ;ja++){
if ((ia<=ii) && (ja<=jj));
else{
if (G[ii][jj] != G[ia][ja]);
else
x++;
}
}
}
}
}
if (x!=0) return false;
else return true;
}
static int calculaK (int L, int C){
int K;
if(L==1 || L==2 || L==3) {
if (C==1 || C==2 || C==3) return K=1;
else{
if (C==4 || C==5 || C==6) return K=2;
else return K=3;
}
}
else{
if(L==4 || L==5 || L==6){
if (C==1 || C==2 || C==3) return K=4;
else{
if (C==4 || C==5 || C==6) return K=5;
else return K=6;
}
}
else{
if (C==1 || C==2 || C==3) return K=7;
else{
if (C==4 || C==5 || C==6) return K=8;
else return K=9;
}
}
}
}
}