이것은 프로그래밍 관점에서 볼 때 매우 흥미로운 문제는 아닙니다. 다음과 같이 모든 배열을 시도하는 재귀 알고리즘을 생각해 볼 수 있습니다.
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 퀸을 맞추는 방법이 없다는 것을 알게 될 것입니다. 왜냐하면 적어도 두 명의 여왕이 같은 순위 또는 파일로 끝나야하기 때문입니다. 그러므로 그들은 서로를 공격 할 것입니다. n-queens 문제에 대해 읽으면 N> 3의 NxN 보드에 N 퀸을 배치하는 것이 항상 가능하다는 것을 빨리 알게 될 것입니다. 이제 우리는 (X <N 또는 Y <N) (X> = N 및 Y> = N, N> 3)에 대해 YES입니다. 남은 것은 특별한 경우입니다.
- N = 1 (예)
- N = 2 (X> = 2 및 Y> 2의 경우 예 또는 그 반대)
- N = 3 (X> = 3 및 Y> 3의 경우 예 또는 그 반대)
이제 우리의 멋진 재귀 함수는 N을 X와 Y를 비교하고 미리 준비된 결과를 반환하는 간단한 함수가됩니다. 일정한 시간에 답변을 얻을 수 있기 때문에 성능 관점에서 훌륭합니다. 프로그래밍 관점에서는 그리 좋지 않습니다.이 시점에서 재귀 함수를 작성하는 능력보다 퍼즐을 얼마나 잘 해결할 수 있는지에 대한 질문이 있다는 것을 알고 있기 때문입니다.
(그리고 소년 오 소년, 나는 정말 똑똑한 바지 답변에서 약간의 실수를하지 않았기를 바랍니다. ;-)