Це не дуже важлива проблема з точки зору програмування. Ви можете створити рекурсивний алгоритм, який намагається здійснити кожну композицію, приблизно так:
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)
}
Якщо ви трохи подумаєте про проблему, то зрозумієте, що немає способу помістити N королеви на дошці, де X <N або Y <N, тому що це вимагатиме, щоб принаймні дві королеви опинилися в одному ранзі або файлі, і тому вони б атакували один одного. Якщо ви прочитаєте про проблему n-queens, швидко дізнаєтесь, що завжди можна розмістити N queens на дошці NxN для N> 3. Тепер ми знаємо, що відповідь "НЕ" (X <N або Y <N) і ТАК для (X> = N і Y> = N, N> 3). Залишилися лише спеціальні випадки:
- N = 1 (ТАК)
- N = 2 (ТАК для X> = 2 і Y> 2 або навпаки)
- N = 3 (ТАК для X> = 3 і Y> 3 або навпаки)
Тепер наша приємна рекурсивна функція стає простою функцією, яка просто порівнює N до X і Y і повертає консервований результат. Це чудово з точки зору продуктивності, оскільки відповідь ви можете отримувати постійно. З точки зору програмування, це не так здорово, тому що ви усвідомлюєте, що на даний момент питання стосується насправді питання про те, наскільки добре ви можете розгадувати загадки, ніж про вашу здатність писати рекурсивну функцію.
(І хлопче о хлопчику, я дуже сподіваюся, що я не зробила жодної тупої помилки у відповіді на свої розумні штани. ;-)