これは(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)
}
問題について少し考えると、X <NまたはY <NのボードにNクイーンを合わせる方法はないことがわかります。これは、少なくとも2つのクイーンが同じランクまたはファイルになることを必要とするためです。したがって、彼らはお互いを攻撃します。n-クイーンの問題について読むと、N x NボードにN> 3の場合にNクイーンを配置することが常に可能であることをすぐに理解できます。これで、(X <NまたはY <N)の答えはNOであることがわかります。 (X> = NおよびY> = N、N> 3)の場合はYES。残っているのは特別な場合です:
- N = 1(はい)
- N = 2(X> = 2およびY> 2の場合はYES、またはその逆)
- N = 3(X> = 3およびY> 3またはその逆の場合はYES)
これで、私たちの素晴らしい再帰関数は、NをXおよびYと比較して、既定の結果を返す単純な関数になります。あなたは一定の時間で答えを得ることができるので、それはパフォーマンスの観点から素晴らしいです。現時点では、問題は再帰関数を書く能力よりも、パズルをどれだけうまく解くことができるかということを理解しているため、プログラミングの観点からはそれほど優れていません。
(そして、男の子ああ、私は本当に私が私のスマーティーパンツの答えでいくつかのばかげた過ちを犯さなかったことを本当に望んでいます。;-)