นี่ไม่ใช่ (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-queens คุณจะได้เรียนรู้อย่างรวดเร็วว่าเป็นไปได้ที่จะวาง N queens บนกระดาน NxN สำหรับ N> 3 ตอนนี้เรารู้แล้วว่าคำตอบนั้นไม่ใช่สำหรับ (X <N หรือ Y <N) และ YES สำหรับ (X> = N และ Y> = N, N> 3) สิ่งที่เหลืออยู่เป็นกรณีพิเศษ:
- N = 1 (ใช่)
- N = 2 (YES สำหรับ X> = 2 และ Y> 2 หรือในทางกลับกัน)
- N = 3 (YES สำหรับ X> = 3 และ Y> 3 หรือในทางกลับกัน)
ตอนนี้ฟังก์ชั่นเรียกซ้ำที่ดีของเรากลายเป็นฟังก์ชั่นง่าย ๆ ที่เพิ่งเปรียบเทียบ N กับ X และ Y และส่งกลับผลลัพธ์กระป๋อง ยอดเยี่ยมมากจากมุมมองประสิทธิภาพเนื่องจากคุณสามารถได้รับคำตอบในเวลาที่แน่นอน มันไม่ได้ยอดเยี่ยมนักจากมุมมองการเขียนโปรแกรมเพราะคุณรู้ว่า ณ จุดนี้คำถามนี้เป็นเรื่องเกี่ยวกับวิธีแก้ปริศนาที่ดีกว่าความสามารถในการเขียนฟังก์ชันแบบเรียกซ้ำ
(และเด็กชายโอ้เด็กฉันหวังว่าฉันจะไม่ทำผิดพลาดโง่ ๆ ในคำตอบที่ชาญฉลาดของฉันกางเกง ;-)