Это (IMO) не очень интересная проблема с точки зрения программирования. Вы могли бы придумать рекурсивный алгоритм, который пробует каждое расположение, что-то вроде этого:
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 ферзей на 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 и возвращает стандартный результат. Это здорово с точки зрения производительности, так как вы можете получить ответ в постоянное время. Это не так здорово с точки зрения программирования, потому что в этот момент вы понимаете, что вопрос действительно больше в том, насколько хорошо вы можете решать головоломки, чем в том, как вы можете написать рекурсивную функцию.
(И, боже, боже, я действительно надеюсь, что я не совершил глупой ошибки в своем ответе на умные штаны. ;-)