Sudoku backtracking

Sudoku backtracking

Contenido

Descripción detallada del problema

El famoso juego del Sudoku consiste en rellenar un cubo de 9 x 9 celdas dispuestas en 9 subgrupos de 3 x 3 celdas, con números del 1 al 9, atendiendo a la restricción de que no se debe repetir el mismo número en la misma fila, columna o subgrupo de 9.

Un Sudoku dispone de varias celdas con un valor inicial, de modo que debemos empezar a resolver el problema a partir de esta solución parcial sin modificar ninguna de las celdas iniciales.

Estrategia de resolución usando Backtracking

El tablero del Sudoku a resolver viene dado por una matriz “Sol [1..9,1..9] de 0..9” donde Sol[i, j] representa el valor que toma dicha celda, correspondiéndose el valor 0 con una casilla vacía.

Se utilizará una matriz auxiliar “inicial[1..9, 1..9] de Bool” donde inicial[i, j] representa una celda con valor inicial que no se puede modificar y se corresponde con la celda “Sol[i, j]”.

A la hora de ramificar el árbol de exploración, solo lo haremos si la solución parcial que estamos atendiendo es k-prometedora, esto es, si a partir de dicha solución parcial podremos seguir construyendo soluciones parciales. Para atender a este punto, utilizaremos una función auxiliar denominada “es_factible”.

La función “es_factible” comprueba para una celda determinada, que no se repita su valor en la misma fila, columna o subgrupo de 3x3, atendiendo así a la restricción que comentábamos en la descripción detallada del problema.

Dado que un Sudoku Puede tener varias soluciones, implementaremos el algoritmo en consecuencia.

Árbol de exploración

El árbol de exploración generado tendrá las siguientes características:

  • Altura = m + 1:
Siendo m el número de casillas vacías inicialmente.
  • Nº de Hijos de cada nodo = 9:
Un hijo por cada posible valor de la celda i j.

Implementación en Pseudocódigo

Proc sudoku_VA (i, j: Nat; sol[1..9, 1..9] de 0..9; inicial[1..9, 1..9] de Bool)
   Si (inicial [i, j] = Falso) Entonces
      Para (k := 1) Hasta 9 Hacer
         sol[i, j] := k;                                 //marcar
         Si (es_factible (i, j, sol)) Entonces
            Casos
               i = 9 ^ j = 9 -> mostrarPorPantalla(sol);
               i < 9 ^ j = 9 -> sudoku_VA (i+1, 1, sol, inicial);
               i <= 9 ^ j < 9 -> sudoku_VA( i , j+1, sol, inicial);
            FinCasos;
         FinSi;
         sol[i, j] : = 0;                                //Desmarcar
      FinPara;
   En Otro Caso //inicial[i, j] = Cierto
      Casos
         i = 9 ^ j = 9 -> mostrarPorPantalla(sol);
         i < 9 ^ j = 9 -> sudoku_VA (i+1, 1, sol, inicial);
         i <= 9 ^ j < 9 -> sudoku_VA( i , j+1, sol, inicial);
      FinCasos;
   FinSi;    
FinProc;


Llamada Inicial

Proc sudoku (sol[1..9, 1..9] de 0..9)
   Var 
      inicial[1..9, 1..9] de Bool;
   FinVar;
   Para (i := 1) Hasta 9 Hacer
      Para (j := 1) Hasta 9 Hacer
            inicial[i, j] := Sol[i, j] != 0;
      FinPara;
   FinPara;
   sudoku_VA(1, 1, sol, inicial);
FinProc;

Funciones Auxiliares

Función auxiliar que comprueba la factibilidad de una solución parcial.
Fun es_factible (i, j : Nat; sol[1..9, 1..9] de 0..9) DEV Bool
   Mientras (k <= 9 ^ valido) Hacer                   //Comprobamos la columna
      Si ( sol[i, j] = sol[k, j] ^ k != i ){
         Valido := Falso;
      FinSi;
      k := k + 1;
   FinMientras;
   k := correspondencia3x3(i);
   l :=  correspondencia3x3(j);                          //Comprobamos el subgrupo de 3x3
   Mientras ( k < correspondencia3x3(i) + 3 ^ valido ) Hacer 
      Mientras ( l < correspondencia3x3(j) + 3 ^ valido) Hacer
         Si ( sol[i, j] = sol[k, l] ^ i != k ^ j != l) Entonces
            valido := Falso;
         FinSi;
         l := l + 1;
      FinMientras;
      k := k + 1;
      l :=  correspondencia3x3(j);
   FinMientras;
   Devolver valido;
FinFun;
Función auxiliar que se utiliza para averiguar la celda inicial desde la que haremos la comprobación de factibilidad de una celda determinada en su correspondiente subgrupo de 3x3 celdas.
Fun correspondencia3x3 (i: Nat) DEV Nat
   Var
      k : Nat;
      resultado: Nat;
   FinVar;
   Si ( i MOD 3 = 0) Entonces 
      k := (i DIV 3);
   En Otro Caso
      k := ( I DIV 3) + 1;
   FinSi;
   Casos
      k = 1 -> resultado := 1;
      k = 2 -> resultado := 4;
      k = 3 -> resultado := 7;
   FinCasos;
   Devolver resultado;
FinFun;

Otras estrategias de resolución


Wikimedia foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Mira otros diccionarios:

  • Sudoku ramificación y poda — Este artículo o sección debería estar en Wikilibros ya que es una guía o manual en vez de contenido enciclopédico. [ver página en Wikilibros] Si modificas el texto dándole una orientación más enciclopédica, por favor quita este aviso …   Wikipedia Español

  • Sudoku — (jap. 数独 Sūdoku, kurz für 数字は独身に限る Sūji wa dokushin ni kagiru, wörtlich so viel wie „Isolieren Sie die Zahlen“) ist ein Logikrätsel und ähnelt lateinischen Quadraten. In der üblichen Version ist es das Ziel, ein 9×9 Gitter mit den Ziffern 1 bis 9 …   Deutsch Wikipedia

  • Sūdoku — Sudoku (jap. 数独 Sūdoku, kurz für 数字は独身に限る Sūji wa dokushin ni kagiru, wörtlich „Eine Zahl bleibt immer allein“) ist ein Logikrätsel und ähnelt Magischen Quadraten. In der üblichen Version ist es das Ziel, ein 9×9 Gitter mit den Ziffern 1 bis 9 so …   Deutsch Wikipedia

  • Sudoku — proposé par la presse. Le sudoku (prononcé soudokou en français, / …   Wikipédia en Français

  • Backtracking — Der Begriff Rücksetzverfahren oder englisch Backtracking (deut. Rückverfolgung) bezeichnet eine mathematische Problemlösungsmethode innerhalb der Algorithmik. Backtracking arbeitet nach dem Prinzip der Tiefensuche Inhaltsverzeichnis …   Deutsch Wikipedia

  • X-Sudoku — Sudoku (jap. 数独 Sūdoku, kurz für 数字は独身に限る Sūji wa dokushin ni kagiru, wörtlich „Eine Zahl bleibt immer allein“) ist ein Logikrätsel und ähnelt Magischen Quadraten. In der üblichen Version ist es das Ziel, ein 9×9 Gitter mit den Ziffern 1 bis 9 so …   Deutsch Wikipedia

  • Algorithmics of sudoku — The class of Sudoku puzzles consists of a partially completed row column grid of cells partitioned into N regions or zones each of size N cells, to be filled in using a prescribed set of N distinct symbols (typically the numbers {1, ..., N }), so …   Wikipedia

  • Mathematics of Sudoku — The class of Sudoku puzzles consists of a partially completed row column grid of cells partitioned into N regions each of size N cells, to be filled in using a prescribed set of N distinct symbols (typically the numbers {1, ..., N}), so that each …   Wikipedia

  • Carré latin — Sudoku (jap. 数独 Sūdoku, kurz für 数字は独身に限る Sūji wa dokushin ni kagiru, wörtlich „Eine Zahl bleibt immer allein“) ist ein Logikrätsel und ähnelt Magischen Quadraten. In der üblichen Version ist es das Ziel, ein 9×9 Gitter mit den Ziffern 1 bis 9 so …   Deutsch Wikipedia

  • Nanpure — Sudoku (jap. 数独 Sūdoku, kurz für 数字は独身に限る Sūji wa dokushin ni kagiru, wörtlich „Eine Zahl bleibt immer allein“) ist ein Logikrätsel und ähnelt Magischen Quadraten. In der üblichen Version ist es das Ziel, ein 9×9 Gitter mit den Ziffern 1 bis 9 so …   Deutsch Wikipedia

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”