#include <stdio.h>
//#define UNA_SOLUCION
int numero_sol;
mostrar (int m[9][9])
{
int i, j;
for (i = 0 ; i < 9 ; i++) {
for (j = 0 ; j < 9 ; j++)
printf ("%i ", m[i][j]);
printf("\n");
}
}
int ok (int m[9][9], int i, int j)
{
int k,k1,n;
int r_i, r_j;
int v_i, v_j;
n = m[i][j];
/* está en fila o columna? */
for (k=0;k<9;k++){
if ((j!=k) && (m[i][k] == n))
return 0;
if ((i!=k) && (m[k][j] == n))
return 0;
}
/* esta en cuadrado? */
r_i = i % 3;
r_j = j % 3;
v_i = i / 3;
v_j = j / 3;
for (k = 0; k < 3; k++)
for (k1 = 0; k1 < 3; k1++){
if ((m[(v_i*3) + k][(v_j*3) + k1] == n)
&& (!((r_i == k) && (r_j == k1))))
return 0;
}
return 1;
}
int completa (int m[9][9], int i, int j, int z)
{
int k,z2;
if (m[i][j] != 0) {/* es un número */
if (ok(m, i, j)) {
if ((i == 8) && (j == 8)){
printf ("Solución n: %i:\n\n", ++numero_sol);
mostrar(m);
#ifdef UNA_SOLUCION
return 1;
#endif
#ifndef UNA_SOLUCION
return 0;
#endif
}
else{
if (j==8){
if (m[i+1][0]==0)
z2=1;
else
z2=0;
if (completa(m, i+1, 0, z2))
return 1;
return 0;
}
else{
if (m[i][j+1]==0)
z2=1;
else
z2=0;
if (completa(m, i, j+1, z2))
return 1;
return 0;
}
//if (z==1) SUPERFLUO SUPONGO
//m[i][j]=0;
Yo lo hice en C
(Puntos:2)( Última bitácora: Miércoles, 10 Marzo de 2010, 15:16h )
Claro que no usé técnicas tan sofisticadas. El mio prueba todas las posibilidades de manera recursiva. Es un ejemplo de recursividad típico.
omnia sunt communia
Aquí el código:
(Puntos:2)( Última bitácora: Miércoles, 10 Marzo de 2010, 15:16h )
//#define UNA_SOLUCION
int numero_sol;
mostrar (int m[9][9])
{
int i, j;
for (i = 0 ; i < 9 ; i++) {
for (j = 0 ; j < 9 ; j++)
printf ("%i ", m[i][j]);
printf("\n");
}
}
int ok (int m[9][9], int i, int j)
{
int k,k1,n;
int r_i, r_j;
int v_i, v_j;
n = m[i][j];
for (k=0;k<9;k++){
if ((j!=k) && (m[i][k] == n))
return 0;
if ((i!=k) && (m[k][j] == n))
return 0;
}
r_i = i % 3;
r_j = j % 3;
v_i = i / 3;
v_j = j / 3;
for (k = 0; k < 3; k++)
for (k1 = 0; k1 < 3; k1++){
if ((m[(v_i*3) + k][(v_j*3) + k1] == n)
&& (!((r_i == k) && (r_j == k1))))
return 0;
}
return 1;
}
int completa (int m[9][9], int i, int j, int z)
{
int k,z2;
if (m[i][j] != 0) {
if (ok(m, i, j)) {
if ((i == 8) && (j == 8)){
printf ("Solución n: %i:\n\n", ++numero_sol);
mostrar(m);
#ifdef UNA_SOLUCION
return 1;
#endif
#ifndef UNA_SOLUCION
return 0;
#endif
}
else{
if (j==8){
if (m[i+1][0]==0)
z2=1;
else
z2=0;
if (completa(m, i+1, 0, z2))
return 1;
return 0;
}
else{
if (m[i][j+1]==0)
z2=1;
else
z2=0;
if (completa(m, i, j+1, z2))
return 1;
return 0;
}
omnia sunt communia