En un tablero de ajedrez, una reina es peligrosa porque su sola ubicación descarta muchas casillas. Para convertir esto en un problema de búsqueda, primero debemos describir exactamente qué casillas ataca una reina; así, podemos tratar los ataques como restricciones que invalidan las posibles ubicaciones. Este enfoque es importante porque permite construir una solución candidata paso a paso y descartar opciones parciales tan pronto como infrinjan una regla, en lugar de esperar a que el tablero esté lleno.
Una configuración es válida solo si ninguna reina ataca a otra, lo que implica que deben cumplirse tres restricciones simultáneamente: dos reinas no pueden compartir la misma fila, la misma columna ni la misma diagonal.
Para visualizar mejor estas restricciones, observemos cómo una única reina situada en una coordenada específica marca las casillas atacadas en un tablero pequeño.
Las restricciones de fila y columna son directas, ya que cualquier casilla que comparta el mismo índice de fila o de columna resulta atacada. La restricción de diagonal también es mecánica, pues las casillas permanecen en una diagonal cuando sus coordenadas de fila y columna varían simultáneamente; así, una reina ataca las casillas situadas a lo largo de ambas direcciones diagonales hasta que el borde del tablero interrumpe la línea.
Una vez claras las restricciones, el siguiente paso consiste en elegir una representación que facilite la construcción incremental de soluciones candidatas. Una opción sencilla es utilizar un arreglo unidimensional donde queens[row] = col, lo que significa que la reina correspondiente a la fila row se sitúa en la columna col. Con esta representación, la restricción de fila se cumple por diseño, dado que cada índice de fila aparece una sola vez.
El widget muestra cómo un arreglo específico se corresponde con una posición del tablero representada gráficamente.