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
alejandro00_72@hotmail.com
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;
}
}
}
}
}





Mode Lineal
