Questo non è (IMO) un problema molto interessante dal punto di vista della programmazione. Potresti trovare un algoritmo ricorsivo che prova ogni accordo, qualcosa del genere:
bool try_queens(Board board, int n)
{
if (n == 0) {
// no queens left to place, so we're done
return true
}
// try each open position until we find one that works
for each position on the board {
if (is_empty(board, position) and not is_attacked(board, position)) {
place_queen(board, position)
if (try_queens(board, n-1)) {
return true
}
remove_queen(board, position)
}
}
// if we get this far, there's no available position
return false
}
main()
{
initialize board(X,Y)
return try_queens(board, N)
}
Se pensi un po 'al problema, ti renderai conto che non c'è modo di adattare N regine su una scheda in cui X <N o Y <N perché ciò richiederebbe che almeno due regine finiscano nello stesso rango o file, e quindi si attaccerebbero l'un l'altro. Se leggi del problema n-queens, imparerai rapidamente che è sempre possibile posizionare N queens su una scheda NxN per N> 3. Ora sappiamo che la risposta è NO per (X <N o Y <N) e SÌ per (X> = N e Y> = N, N> 3). Tutto ciò che rimane sono i casi speciali:
- N = 1 (SÌ)
- N = 2 (SÌ per X> = 2 e Y> 2 o viceversa)
- N = 3 (SÌ per X> = 3 e Y> 3 o viceversa)
Quindi ora la nostra bella funzione ricorsiva diventa una semplice funzione che confronta semplicemente N con X e Y e restituisce un risultato fisso. È fantastico dal punto di vista delle prestazioni, poiché puoi ottenere una risposta in tempo costante. Non è eccezionale dal punto di vista della programmazione perché ti rendi conto, a questo punto, che la domanda è davvero più su quanto puoi risolvere i puzzle piuttosto che sulla tua capacità di scrivere una funzione ricorsiva.
(E ragazzo oh ragazzo, spero davvero di non aver fatto qualche stupido errore nella mia risposta da smarty-pants. ;-)