Foros del Web » Programación para mayores de 30 ;) » Java »

Afectación no deseada un Sudoku

Estas en el tema de Afectación no deseada un Sudoku en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 25/02/2008, 07:29
 
Fecha de Ingreso: diciembre-2007
Mensajes: 4
Antigüedad: 16 años, 5 meses
Puntos: 0
Afectación no deseada un Sudoku

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;
}
}
}
}


}
  #2 (permalink)  
Antiguo 26/02/2008, 07:29
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: Afectación no deseada un Sudoku

Tienes que usar un esquema de divide y vencerás. Ese esquema planteado no lo recomiendan por su ineficiencia. (Profesores dixit). :)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:56.