D E A P T H     F I R S T     S E A R C H
              การค้นหาตามแนวลึก ( Deapth first Search ) เป็นวิธีการค้นหาในระดับที่ลึงลงไปเรื่อย ๆ ไม่มีการกวาดหาตามแนวกว้าง หรือ กวาดหาทุกค่าในระดับความลึกเดียวกัน จนกว่าจะถึงระดับความลึกตามที่กำหนด หรือ ลึกถึงที่สุด จึงย้อนกลับ มาค้นหา ค่าใหม่ ต่อไป ตัวอย่างที่ง่ายที่สุดสำหรับการค้นหาในลักษณะวิธีนี้คือการค้นหา แบบ Preorder ใน Tree
              เพื่อให้เข้าใจยิ่งขึ้น เราจะมาศึกษาปัญหาการเปิด/เปิด หลอดไฟ ( ข้อสอบ คอมพิวเตอร์ โอลิมปิก วิชาการ นานาชาติ ) ซึ่งมีรายละเอียด ดังนี้
                  - ถ้ามีหลอดไฟ N หลอดที่กำลังเปิดอยู่ (เปิด ให้สถานะเป็น 1, ปิด ให้สถานะเป็น 0)
                    - การ ปิด/เปิด มีด้วยกัน 4 วิธี
                              1. เปลี่ยนสถานะดวงไฟในลักษณะตรงกันข้ามทุกดวง
                              2. เปลี่ยนสถานะดวงไฟในลักษณะตรง เฉพาะดวงไฟหมายเลขคี่
                              3. เปลี่ยนสถานะดวงไฟในลักษณะตรง เฉพาะดวงไฟหมายเลขคู่
                              4. เปลี่ยนสถานะดวงไฟในลักษณะตรง เฉพาะดวงไฟหมายเลข 1, 3, 7 . . .
                    - ถ้ากำหนดการ ปิด/เปิด C ครั้ง ซึ่งจะเลือก ปิด/เปิด จาก 4 วิธีข้างต้น เพื่อให้สอดคล้อง กับเงื่อนไขสุดท้าย     เช่น หลอดที่ 1, 4 และ 5 ปิด หลอดที่ 3 เปิด     จะเห็นว่าการค้นหาด้วยวิธี Deapth first Search จะเหมาะสมที่สุด สำหรับกรณีนี้ เพราะสถานะสุดท้ายคือ สถานะ ที่ ต้องการ ดังนั้นจึงไม่ จำเป็นต้อง ขยาย ทุกค่า ทุกระดับ ซึ่งจะทำ ให้ Search space มีขนาดใหญ่ขึ้น และเป็นสาเหตุทำให้หน่วยความจำ เต็ม
              ถ้าให้ N = 10, C = 3 และสถานะสุดท้ายที่ต้องการ คือ หลอดที่ 1 และ 2 ปิด, หลอดที่ 3 เปิด

การค้นหาตามแนวลึก ครั้งที่ 1
หลอดที่ (1)   (2)   (3)   (4)   (5)   (6)   (7)   (8)   (9)   (10)  
สถานะ เริ่มต้น1111111111
ปิด/เปิดด้วยวิธีที่ 1   0000000000ครั้งที่ 1
ปิด/เปิดด้วยวิธีที่ 1   1111111111ครั้งที่ 2
ปิด/เปิดด้วยวิธีที่ 1   0000000000ครั้งที่ 3
ไม่มีคำตอบ

การค้นหาตามแนวลึก ครั้งที่ 2
หลอดที่ (1)   (2)   (3)   (4)   (5)   (6)   (7)   (8)   (9)   (10)  
สถานะ เริ่มต้น1111111111
ปิด/เปิดด้วยวิธีที่ 1   0000000000ครั้งที่ 1
ปิด/เปิดด้วยวิธีที่ 1   1111111111ครั้งที่ 2
ปิด/เปิดด้วยวิธีที่ 2   0101010101ครั้งที่ 3
ไม่มีคำตอบ

การค้นหาตามแนวลึก ครั้งที่ 3
หลอดที่ (1)   (2)   (3)   (4)   (5)   (6)   (7)   (8)   (9)   (10)  
สถานะ เริ่มต้น1111111111
ปิด/เปิดด้วยวิธีที่ 1   0000000000ครั้งที่ 1
ปิด/เปิดด้วยวิธีที่ 1   1111111111ครั้งที่ 2
ปิด/เปิดด้วยวิธีที่ 3   1010101010ครั้งที่ 3
ไม่มีคำตอบ

การค้นหาตามแนวลึก ครั้งที่ 4
หลอดที่ (1)   (2)   (3)   (4)   (5)   (6)   (7)   (8)   (9)   (10)  
สถานะ เริ่มต้น1111111111
ปิด/เปิดด้วยวิธีที่ 1   0000000000ครั้งที่ 1
ปิด/เปิดด้วยวิธีที่ 1   1111111111ครั้งที่ 2
ปิด/เปิดด้วยวิธีที่ 4   0110110110ครั้งที่ 3
ไม่มีคำตอบ
o             o             o
การค้นหาตามแนวลึก ครั้งที่ i
หลอดที่ (1)   (2)   (3)   (4)   (5)   (6)   (7)   (8)   (9)   (10)  
สถานะ เริ่มต้น1111111111
ปิด/เปิดด้วยวิธีที่ 1   0000000000ครั้งที่ 1
ปิด/เปิดด้วยวิธีที่ 4   1001001001ครั้งที่ 2
ปิด/เปิดด้วยวิธีที่ 2   0011100011ครั้งที่ 3
ดังนั้นถ้าต้องการให้ หลอดที่ 1 และ 2 ปิด, หลอดที่ 3 เปิด ต้องกดด้วยวิธีที่ 1, 4 และ 2 เป็นต้น

              Lamps.c เป็นโปรแกรมเพื่อแก้ปัญหานี้ โปรแกรมนี้จะรับ Input จาก แฟ้มข้อมูล in.txt และจะได้ output ในแฟ้ม out.txt สิ่งที่ควรระวัง คือ ถ้ากำหนดให้ กด หลายๆ ครั้ง และจำนวน หลอดไฟ มาก ๆ จะทำให้ หน่วยความจำเต็มเร็วมาก     และถ้ากำหนดเงื่อนไขสุดท้าย มาก ก็จะไม่มีคำตอบ เลย       สำหรับ Lamps1.c จะรับ Input จากแป้นพิมพ์ แต่ก็ได้เตรียมโปรแกรม ให้แก้ไข เพื่อให้รับข้อมูล จากแฟ้ม ข้อมูล in.txt

Back to MENU