Estoy tratando de hacer un solucionador de sudoku. el código funciona, sin embargo, cuando no hay más 0 (ceros) en la tabla, eso significa que mi tabla de sudoku está resuelta. si la tabla de sudoku se ha resuelto, quiero que todo deje de funcionar. El problema es que no he encontrado una buena manera de detener la ejecución del programa cuando se resuelve. Estoy abierto a sugerencias.
el caso que se supone que detiene la ejecución del programa es function find_empty_space(table) , es la primera condición if, sin embargo, en la function sudoku_solver(table) llama a var values = find_empty_space(table); y como no devuelvo nada si ocurre este caso ocurre un error.
Intenté agregar una condición if debajo var values = find_empty_space(table); donde valores == nulo, entonces no pasa nada, por lo que la función puede detenerse, pero eso por alguna razón arruina el funcionamiento del solucionador de sudoku. si alguien tiene otra idea de cómo detener mi programa y todas las demás funciones después de que se cumpla la condición, por favor lmk
var sudoku_1 = [ [0, 0, 0, 0], [1, 0, 2, 0], [0, 1, 4, 0], [2, 0, 0, 1], ]; var table = sudoku_1; function find_empty_space(table) { if ( table[0].indexOf(0) == -1 && table[1].indexOf(0) == -1 && table[2].indexOf(0) == -1 && table[3].indexOf(0) == -1 ) { console.log("Sudoku Solver has solved your table"); var solved_table = table; } else { for (var r = 0; r < 5; r++) { for (var c = 0; c < 5; c++) { console.log(`row: ${r}`); //!for testing console.log(`column: ${c}`); //!for testing // if object in array is equal to 0 then it means the space is empty if (table[r][c] == 0) { return [r, c]; } } } } } function check_if_number_can_go_in_position(table, n, r, c) { console.log("function check_if_number_can_go_in_position()"); console.log(`row ${table[r]}`); // var below makes a array of tables column that is need to search for n var column_c = table.map((d) => d[c]); console.log(`col ${column_c}`); if (table[r].indexOf(n) != -1) { console.log("backtrack r"); return false; } if (column_c.indexOf(n) != -1) { console.log("backtrack c"); return false; } return true; } // this is the main function function sudoku_solver(table) { var values = find_empty_space(table); console.log(values); var r = values[0]; var c = values[1]; console.log("in one"); for (var n = 1; n < 5; n++) { console.log(`n = ${n}`); if (check_if_number_can_go_in_position(table, n, r, c) == true) { table[r][c] = n; console.table(table); sudoku_solver(table); } } table[r][c] = 0; } sudoku_solver(table);Suponiendo que esto es para la variante de Sudoku de 16x16, ya que la entrada en el OP es solo de 4x4; de acuerdo con esta suposición, debe encontrar todos los espacios en blanco (representados como 0 ) en un cuadro . En el siguiente ejemplo, la función blankMap(box) toma una matriz 2D de cualquier tamaño y devuelve una matriz de pares. Una matriz de pares es una matriz 2D de N filas y 2 columnas. En cada par (o subarreglo) está la ubicación de un 0 : la primera columna ( Array[N][0] ) representa el número de índice de una fila, la segunda columna ( Array[N][1] ) representa el número de índice de una columna.
| APORTE | PRODUCCIÓN |
|---|---|
| const box9 = [ | caja constante9X = [ |
| [0, 12, 0, 9], | [0, 0], [0, 2], |
| [16, 3, 0, 8], | [1, 2], |
| [0, 0, 0, 0], | [2, 0], [2, 1], [2, 2], [2, 3], |
| [10, 5, 2, 0] | [3, 3] |
| ]; | ]; |
/* INPUT A 4 row by 4 colunm table represents 1 of a total of 16 sub-tables. */ const box0 = [ [0, 5, 13, 0], [10, 0, 0, 0], [7, 11, 3, 0], [0, 0, 0, 0] ]; const box13 = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16] ]; const blankMap = box => box.flatMap((arr, row) => // 1st grab each sub-array (~arr~) arr.flatMap((num, col) => // On each ~arr~,... num === 0 ? [[row, col]] : [])); /* ...if it's a ~0~ ~?~ then return the position in double brackets: ~[[row, col]]~ otherwise ~:~ return an empty array ~[]~.*/ // A utility to verify if a box is completed const isDone = array => array.length < 1; console.log('box0=-=-=-=-=-=-=-=-=-=-=-=-='); let b0 = blankMap(box0); console.log(JSON.stringify(b0)); console.log('box0 is complete: '+isDone(b0)); console.log('box13-=-=-=-=-=-=-=-=-=-=-=-='); let b13 = blankMap(box13); console.log(JSON.stringify(b13)); console.log('box13 is complete: '+isDone(b13)); El método .flatMap() se usó dos veces: una vez para iterar a través de la matriz externa y tomar las sub-matrices, y una vez para iterar a través de cada sub-matriz para encontrar los 0 s. .flatMap() es la combinación de los métodos .map() y .flat() , por lo que si desea obtener la devolución como una matriz 2D, envuélvala entre paréntesis (el doble si otro .flatMap() está trabajando en la misma matriz). A la inversa, si desea ignorar por completo una iteración, devuelva una matriz vacía [] .
Marcó el código agregado
function find_empty_space(table) { // function goes from right to left of table finding every empty space, empty space == 0, //for loops go through 1-4 // var meanings r = row, c = column if ( table[0].indexOf(0) == -1 && table[1].indexOf(0) == -1 && table[2].indexOf(0) == -1 && table[3].indexOf(0) == -1 ) { console.log("Sudoku Solver has solved your table"); var solved_table = table; return true; // ***** added this } else { for (var r = 0; r < 5; r++) { for (var c = 0; c < 5; c++) { console.log(`row: ${r}`); //!for testing console.log(`column: ${c}`); //!for testing // if object in array is equal to 0 then it means the space is empty if (table[r][c] == 0) { return [r, c]; } } } } } // this is the main function function sudoku_solver(table) { // contains all other sub functions this is the main function //r = row, c = column // function goes from right to left of table finding every empty space, empty var values = find_empty_space(table); if (values === true) return true; // ***** added this console.log(values); var r = values[0]; var c = values[1]; console.log("in one"); for (var n = 1; n < 5; n++) { console.log(`n = ${n}`); if (check_if_number_can_go_in_position(table, n, r, c) == true) { table[r][c] = n; console.table(table); if (sudoku_solver(table) === true) // ***** changed this return true; // ***** added this } } table[r][c] = 0; } sudoku_solver(table);