Dies ist aus programmtechnischer Sicht kein (IMO) sehr interessantes Problem. Sie könnten einen rekursiven Algorithmus entwickeln, der jede Anordnung ausprobiert, etwa so:
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)
}
Wenn Sie ein wenig über das Problem nachdenken, werden Sie feststellen, dass es keine Möglichkeit gibt, N Königinnen auf ein Brett zu setzen, auf dem X <N oder Y <N ist, da dies erfordern würde, dass mindestens zwei Königinnen in demselben Rang oder derselben Datei landen. und sie würden sich deshalb gegenseitig angreifen. Wenn Sie über das Problem der n-Königinnen lesen, werden Sie schnell feststellen, dass es immer möglich ist, N-Königinnen für N> 3 auf einer NxN-Tafel zu platzieren. Jetzt wissen wir, dass die Antwort NEIN für (X <N oder Y <N) ist. und JA für (X> = N und Y> = N, N> 3). Übrig bleiben nur die Sonderfälle:
- N = 1 (JA)
- N = 2 (JA für X> = 2 und Y> 2 oder umgekehrt)
- N = 3 (JA für X> = 3 und Y> 3 oder umgekehrt)
Jetzt wird unsere schöne rekursive Funktion zu einer einfachen Funktion, die nur N mit X und Y vergleicht und ein vordefiniertes Ergebnis zurückgibt. Das ist aus Sicht der Leistung großartig, da Sie in konstanter Zeit eine Antwort erhalten können. Aus programmtechnischer Sicht ist es nicht so toll, weil Sie an diesem Punkt erkennen, dass es bei der Frage mehr darum geht, wie gut Sie Rätsel lösen können, als darum, ob Sie eine rekursive Funktion schreiben können.
(Und Junge, Junge, ich hoffe wirklich, dass ich in meiner Smarty-Pants-Antwort keinen dummen Fehler gemacht habe. ;-)