Código de lenguaje C del algoritmo de Sudoku
1. Pasos:
1. Para cada espacio, infiera el número que se puede completar de acuerdo con las reglas y almacene todos sus valores posibles. > 2. Determine el orden de llenado en función del número de valores posibles. Por ejemplo, solo hay una posibilidad para algunos espacios en blanco y ese debe ser el resultado correcto, complételo primero.
3. Después de llenar todos los espacios que tienen una sola posibilidad, regrese al paso 1 y vuelva a determinar los valores posibles de los espacios restantes.
4. no hay una posibilidad Cuando hay espacios (es decir, cada espacio tiene más de dos posibilidades), en orden del número de valores posibles de pequeño a grande, utilice primero la búsqueda en profundidad (ancho) para completar los espacios restantes.
2. Rutinas: #include?lt; windows.hgt;
#include?lt; hgt;
char?sd[81];
bool?isok?=?false;
//Mostrar Sudoku
void ?show()
{ if?(isok)?puts("Solución completada"); else?puts("Inicialización completada"); lt;?81;?i) { putchar(sd[i]? ?'0'); si?((i? ?1)??9?==?0)?putchar('\n') ; putchar('\n');
}
//Leer Sudoku
bool?Init()
{ ARCHIVO?* fp?=?fopen("in.txt",?"rb"); si?(fp?==?NULL)?return?false(sd,?81,?1,?fp) ; ); para?(int?i?=?0;?i?lt;?81;?i ) { si?(sd[i]?gt;=?'1'?amp;amp;? sd[i] ?lt;=?'9')?sd[i]?-=?'0'; else?sd[i]?=?0 } show(); retorno?true;
}
//Resolver Sudoku de forma recursiva
void?force(int?k)
{ if?(isok)?return; ]) { para?(int?m?=?1;?m?lt;=?9;?m ) {
bool?mm?=?true;
para ?(int?n?=?0;?n?lt;?9;?n )
{
si?((m?==? sd[k/27 *27 (k9/3)*3 n n/3*6])?||?(m?==?sd[9*n k9])?||?(m?==?sd [k/9* 9 n]))
{ mm?=?false; romper;
}
}
si ?(mm)
{
sd[k]?=?m;
si?(k?==?80)
{ isok? =?verdadero; mostrar(); retorno;
}
fuerza(k? ?1);
} } sd[k ]?=?0 ; } else { if?(k?==?80) {
isok?=?true;
mostrar();
return } (k? ?1); }
}
int?main()
{ sistema("CLS"); { double?start?=?clock(); force(0); printf("Consume tiempo.0fms",?clock()?-?start); } else?puts("Error de inicialización");
}