Đây không phải là (IMO) một vấn đề rất thú vị từ quan điểm lập trình. Bạn có thể đưa ra một thuật toán đệ quy thử mọi cách sắp xếp, đại loại như thế này:
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ếu bạn nghĩ về vấn đề một chút, bạn sẽ nhận ra rằng không có cách nào phù hợp với N nữ hoàng trên một bảng trong đó X <N hoặc Y <N bởi vì điều đó sẽ yêu cầu ít nhất hai nữ hoàng kết thúc trong cùng một thứ hạng hoặc tệp, và do đó họ sẽ tấn công lẫn nhau. Nếu bạn đọc về vấn đề nữ hoàng, bạn sẽ nhanh chóng biết rằng luôn có thể đặt N nữ hoàng trên bảng NxN cho N> 3. Bây giờ chúng tôi biết rằng câu trả lời là KHÔNG cho (X <N hoặc Y <N) và CÓ cho (X> = N và Y> = N, N> 3). Tất cả những gì còn lại là những trường hợp đặc biệt:
- N = 1 (CÓ)
- N = 2 (CÓ cho X> = 2 và Y> 2 hoặc ngược lại)
- N = 3 (CÓ cho X> = 3 và Y> 3 hoặc ngược lại)
Vì vậy, bây giờ hàm đệ quy tốt đẹp của chúng ta trở thành một hàm đơn giản chỉ cần so sánh N với X và Y và trả về kết quả đóng hộp. Đó là điều tuyệt vời từ quan điểm hiệu suất, vì bạn có thể nhận được câu trả lời trong thời gian liên tục. Theo quan điểm lập trình, nó không tuyệt vời lắm vì bạn nhận ra rằng, câu hỏi thực sự là về cách bạn có thể giải các câu đố tốt hơn khả năng viết một hàm đệ quy.
(Và chàng trai ơi, tôi thực sự hy vọng rằng tôi đã không phạm phải một số sai lầm ngớ ngẩn trong câu trả lời thông minh của mình .--)