Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/11/2014, 01:26
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Algoritmo para resolver sudoku incomprensible

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 original
  1. for (i = 0; i < 9; i++)
  2.         used |= 1 << (x[i * 9 + col] - 1);
  3.  
  4.     for (j = 0; j < 9; j++)
  5.         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 original
  1. for (i = row; i < row + 3; i++)
  2.         for (j = col; j < col + 3; j++)
  3.             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 original
  1. for (x[pos] = 1; x[pos] <= 9; x[pos]++, used >>= 1)
  2.         if (!(used & 1) && trycell(x, pos + 1))
  3.             return 1;