"เป็นวิธีการแก้ปัญหาโดยการ สร้างความเป็นไปได้ทั้งหมด ของคำตอบ แล้วตรวจสอบว่าแต่ละวิธีถูกต้องหรือไม่"
ใช้หลักการ "เลือก" หรือ "ไม่เลือก" สมาชิกแต่ละตัว
Complexity: $O(2^n)$
ใช้บิต 0 และ 1 แทนสถานะการเลือกสมาชิก
std::next_permutation เพื่อสร้างวิธีถัดไปใน $O(N)$
"Try - Recurse - Undo"
1. Try: วางชิ้นส่วนคำตอบลงในตำแหน่งปัจจุบัน
2. Recurse: เรียกฟังก์ชันเดิมเพื่อวางชิ้นส่วนถัดไป
3. Undo: ดึงชิ้นส่วนออกเพื่อลองความเป็นไปได้อื่น
"หัวใจสำคัญคือการล้างค่าสถานะ (Reset state) หลังจากการเรียกเสร็จสิ้น"
วางควีน $N$ ตัวในกระดาน $N \times N$ โดยไม่ให้ควีนตัวใดกินกันได้เลย
• แถวเดียวกัน (Row)
• คอลัมน์เดียวกัน (Col)
• แนวทแยง (Diagonals)
หากปัญหาเหมือนกันในมุมกลับ ให้คำนวณด้านเดียวแล้วคูณสอง
หากรู้แน่ๆ ว่าเส้นทางนี้ไม่มีทางได้คำตอบ ให้หยุดและย้อนกลับทันที
การตัดกิ่งที่ดีสามารถลดเวลาทำงานจากนาทีให้เหลือเพียงวินาทีได้
"ในโจทย์ระดับ IOI Style อัลกอริทึม Backtracking แบบพื้นฐานอาจจะได้เพียง 20-30 แต้ม
แต่ถ้าเราเพิ่ม Pruning ที่ฉลาดเข้าไป เราอาจจะเก็บคะแนนได้ถึง 60-100 แต้ม!"
"First make it work, then make it fast"
15.00 - 17.00 น.
Practice: N-Queens, Subsets, Permutations
"โค้ดที่ดีที่สุดคือโค้ดที่คุณเขียนด้วยตัวเอง" เจอกันในแล็บครับ!