To nie jest (IMO) bardzo interesujący problem z punktu widzenia programowania. Możesz wymyślić algorytm rekurencyjny, który wypróbuje każde ustawienie, coś takiego:
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)
}
Jeśli zastanowisz się trochę nad tym problemem, zdasz sobie sprawę, że nie ma sposobu, aby dopasować N królowych na planszy, gdzie X <N lub Y <N, ponieważ wymagałoby to, aby co najmniej dwie królowe znalazły się w tym samym rankingu lub pliku, i dlatego atakują się nawzajem. Jeśli przeczytasz o problemie n-królowych, szybko dowiesz się, że zawsze można umieścić N królowych na tablicy NxN dla N> 3. Teraz wiemy, że odpowiedź brzmi NIE dla (X <N lub Y <N) i TAK dla (X> = N i Y> = N, N> 3). Pozostały tylko specjalne przypadki:
- N = 1 (TAK)
- N = 2 (TAK dla X> = 2 i Y> 2 lub odwrotnie)
- N = 3 (TAK dla X> = 3 i Y> 3 lub odwrotnie)
Więc teraz nasza ładna funkcja rekurencyjna staje się prostą funkcją, która po prostu porównuje N z X i Y i zwraca wynik standardowy. To świetne z punktu widzenia wydajności, ponieważ możesz uzyskać odpowiedź w stałym czasie. Z punktu widzenia programowania nie jest to takie wspaniałe, ponieważ zdajesz sobie sprawę, że w tym momencie chodzi o to, jak dobrze rozwiązywać zagadki, niż o umiejętność pisania funkcji rekurencyjnej.
(A chłopcze, och chłopcze, naprawdę mam nadzieję, że nie popełniłem głupiego błędu w odpowiedzi na smarty-spodnie. ;-)