Ayuda de diseño de progtwigción – ¿Cómo estructurar un progtwig de Sudoku Solver?

Estoy tratando de crear un progtwig de resolución de sudoku en Java (tal vez Python). Me pregunto cómo debería estructurar esto …

¿Creo una clase y hago de cada caja un objeto de esa clase (9×9 = 81 objetos)? En caso afirmativo, ¿cómo controlo todos los objetos? En otras palabras, ¿cómo hago que todos llamen a un determinado método en la clase?

¿Simplemente creo funciones para calcular y solo controlo todos los números allí con algo como una matriz multi-D?

Y en realidad, incluso si pudiera crear múltiples funciones, ¿cómo controlaría todos los objetos si tuviera que convertir cada caja en un objeto?

Gracias.

    No lo diseñes demasiado. Es una matriz 2-D o tal vez una clase Board que, en el mejor de los casos, representa una matriz 2-D. Tiene funciones que calculan una fila / columna determinada y funciones que te permiten acceder a cada cuadrado. Se pueden usar métodos adicionales para validar que cada sub-3×3 y fila / columna no violen las restricciones requeridas.

    Bueno, usaría una clase para el sudoku en sí, con una matriz de 9 x 9 y toda la funcionalidad para agregar números y detectar errores en el patrón.

    Se utilizará otra clase para resolver el rompecabezas.

    La forma más sencilla de hacerlo es representar el tablero mediante una matriz 2D de 9×9. Querrá tener referencias a cada fila, columna y cuadro 3×3 como un objeto separado, por lo que almacenar cada celda en una Cadena tiene más sentido (en Java) que usar una primitiva. Con una cadena puede mantener referencias al mismo objeto en varios contenedores.

    ¿Necesitas hacerlo en Python o Java? Hago mucha progtwigción en Python, pero esto se puede hacer de manera mucho más concisa con un progtwig de enteros utilizando un lenguaje como AMPL o GLPK, que me parece más elegante (y generalmente más eficiente) para problemas como este.

    Aquí está en AMPL, aunque no he verificado cómo funciona esto: http://taha.ineg.uark.edu/Sudoku.txt

    solo por diversión, aquí está lo que se supone que es el progtwig más corto, en python, que puede resolver una cuadrícula de sudoku:

    def r(a):i=a.find('0') if i<0:print a [m in[(ij)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for j in range(81)]or r(a[:i]+m+a[i+1:])for m in`14**7*9`]r(raw_input()) 

    hmm ok es bastante críptico y no creo que coincida con tu pregunta, así que me disculpo por este ruido 🙂

    De todos modos aquí encontrarás una explicación de estos 173 personajes. También hay una explicación en francés aquí.

    Tal vez un diseño que tuviera una caja por cuadrado, y otra clase para representar el rompecabezas en sí que tuviera una colección de cajas, contuviera todas las reglas para las interacciones de la caja, y controlar el juego en general sería un buen diseño.

    En primer lugar, parece que hay dos tipos de células.

    • Llamadas conocidas; Aquellos con un valor fijo, sin opciones.

    • Células desconocidas; aquellos con un conjunto de valores candidatos que se reducen a un solo valor final.

    En segundo lugar, hay varios grupos de células.

    • Filas horizontales y columnas verticales que deben tener una celda de cada valor. Esa restricción se usa para eliminar valores de varias celdas en la fila o columna.

    • Bloques 3×3 que deben tener una celda de cada valor. Esa restricción se usa para eliminar valores de varias celdas en el bloque.

    Por último, está la red general. Esto tiene varios puntos de vista complementarios.

    • Son 81 celdas.

    • Las células también se recolectan en una cuadrícula de 3×3 de bloques de 3×3.

    • Las células también se recogen en 9 columnas.

    • Las células también se recogen en 9 filas.

    Y tienes un objeto de estrategia de solucionador.

    1. Cada celda Desconocida se configuró para que haya set( range(1,10) ) como los valores candidatos.

    2. Para cada fila, columna y bloque 3×3 (27 colecciones diferentes):

      a. Para cada celda:

      • Si tiene un valor definido (las celdas conocidas y las celdas desconocidas implementan esto de manera diferente): elimine ese valor de todas las demás celdas de esta agrupación.

    Lo anterior debe ser iterado hasta que no se encuentren cambios.

    En este punto, o bien lo tiene resuelto (todas las celdas informan un valor definido), o bien, tiene algunas celdas con varios valores. Ahora tiene que involucrarse en un sofisticado solucionador de seguimiento para encontrar una combinación de los valores restantes que “funcionan”.

    Una clase que contiene una matriz 1d de 81 ints (0 está vacía) es suficiente para la clase de regla. La clase de regla impone las reglas (no hay números duplicados en cada fila, columna o cuadrado 3×3). También tiene una matriz de 81 bools, por lo que sabe qué celdas están arregladas y cuáles deben resolverse. La interfaz pública de esta clase tiene todos los métodos que necesita para manipular el tablero:

     int getCell(int x, int y); bool setCell(int x, int y, int value); bool clearCell(int x, int y); int[] getRow(int x); int[] getCol(int y); int[] getSubBox(int x, int y); void resetPuzzle(); void loadPuzzle(InputStream stream); 

    Luego, su solucionador utiliza la interfaz pública de esta clase para resolver el rompecabezas. La estructura de clase del solucionador que presumo es el propósito de escribir el solucionador de Sudoku número 5 millones. Si estás buscando sugerencias, editaré esta publicación más tarde.