Ver Mensaje Individual
  #16 (permalink)  
Antiguo 21/07/2011, 04:35
Rymura
 
Fecha de Ingreso: febrero-2011
Ubicación: Madrid
Mensajes: 20
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Peroblema al borrar JtextFields de un Panel

sigo avanzando con mi programa.
He creado un metodo recursivo que solucione el sudoku desde donde lo dejo con "mi metodo" (es decir pongo todos los numeros faciles y luego uso fuerza bruta).

Este es el codigo, solo pongo el metodo porque lo demas es exactamente igual, no lo he tocado

Código:
        
    /**
     * Algotirmo recursivo para la solucion del sudoku. Se aplica despues de intentar solucionarlo del otro modo.
     * @param fila donde vamos a intentar colocar el numero
     * @param columna donde vamos a intentar colocar el numero
     */

    //Debemos usar otro tablero para guardarlo como base. Se llamara tableroParcial
    public boolean solve(int fila, int columna)
	  {
      boolean repetido;
      for (int i = 1; i < 10; i++)
		{
    	  //comprobamos que donde vayamos a colocar no haya un numero ya fijo  
    	  // Si lo hay, pasamos a la siguiente casilla
    	  if (tableroParcial[fila][columna] != 0)
    	  {
    		  if (columna <8) 
					columna++;
				else
				{
					columna = 0;
					fila++;
				}
           if (solve(fila, columna) )
			   {
               return true;
			   }
           else return false;
    	  }
    	  //si no es uno fijo de tableroParcial procedemos a ver si se puede colocar
    	  else
    	  {
      		String numero = i + "";
      		tablero[fila][columna].setText(numero);
		  repetido =  verificarColumna(fila,columna) || verificarFila(fila, columna) || verificarCuadrado(fila, columna);
		  if ( !repetido )
		  { 
					// int valor = tableroAux[fila][columna];
					tableroAux[fila][columna]= i;
          if (puestos < 81) 
			{
				puestos++;
				System.out.print(puestos);
				if (columna <8) 
					columna++;
				else
				{
					columna = 0;
					fila++;
				}
             if (solve(fila, columna) )
			   {
                 return true;
              } 
				else
				{
					  tableroAux[fila][columna] = tableroParcial[fila][columna];
					  puestos--;
					  System.out.print("a");
              }
          } 
			else 			
             return true;           
        }
		  else
		  {
			numero = 0 + "";
	      	tablero[fila][columna].setText(numero);
		  }
		}
      }
      return false;
    }

El problema es que mi codigo NO FUNCIONA. Os explico:
es un metodo backtracking, es decir coloca numero a numero hasta dar con la solucion, desde la casilla (0,0) a la (8,8), recordemos que son indices de java.

El fallo lo produce cuando no puede colocar ningun numero en una casilla (exactamente cuando coloca el numero 54, podeis verlo en la consola, es el [2][5] hace un return false y desde hay va hacia atras, no consigo que funcione y vuelva a hacer cambios hacia delante.

Si veis el codigo, nada mas empezar hay una pequeña criba para no poner numeros en las casillas donde tableroParcial ya tenga, que es una matrix que tenia el valor inicial de la matriz antes del back.

podeis bajaros el codigo completo y el sudoku que estoy usando de aqui:

http://www.megaupload.com/?d=FRBOC4AW





Ruego una ayudita, que llegan las vacaiones y no quiero irme con la espinita clavada de que he fallado al crear un programa.