1er paso: comprueba los números que están siendo utilizados en la misma fila (primer bucle) y en la misma columna (segundo bucle)
Código C++:
Ver originalfor (i = 0; i < 9; i++)
used |= 1 << (x[i * 9 + col] - 1);
for (j = 0; j < 9; j++)
used |= 1 << (x[row * 9 + j] - 1);
"used" sirve para almacenar los elementos existentes. Esto lo consigue usando "used" de forma binaria: "si hay un "1", se pone a 1 el bit 1, si hay un "2", se pone a 1 el bit 2, ...
2º paso: recorre la matriz de 3x3 en la que se ubica el número en cuestión y repite la operación de recolectar los números ya usados:
Código C++:
Ver originalfor (i = row; i < row + 3; i++)
for (j = col; j < col + 3; j++)
used |= 1 << (x[i * 9 + j] - 1);
3er paso: Para cada número que no ha sido utilizado comprueba "trycell" (que no se que hace) y si el resultado es positivo, entonces ha encontrado una solución:
Código C++:
Ver originalfor (x[pos] = 1; x[pos] <= 9; x[pos]++, used >>= 1)
if (!(used & 1) && trycell(x, pos + 1))
return 1;