หอคอยฮานอย

ประวัติ

เกมปัญหานี้คิดค้นขึ้นโดย นักคณิตศาสตร์ชาวฝรั่งเศส ชื่อ เอดูอาร์ ลูว์กา (Édouard Lucas) ในปี ค.ศ. 1883 มีตำนานเล่าขานเกี่ยวกับโบสถ์ ในอินเดีย ซึ่งมีห้องที่ภายใน มีเสา 3 หลัก และ จานทองอยู่ 64 ใบ คล้องอยู่กับเสา โดยที่พราหมณ์ในโบสถ์นั้นจะทำการเคลื่อนย้ายจานทองตามคำสั่งที่ระบุไว้ในคำพยากรณ์ โดยการเคลื่อนย้ายนั้นจะต้องเป็นไปตามเงื่อนไขของเกมปัญหา คำพยากรณ์ในตำนานได้ทำนายไว้ว่า เมื่อปัญหาถูกแก้ วาระสุดท้ายของโลกจะมาถึง ดังนั้นปัญหานี้จึงมีอีกชื่อหนึ่งว่า ปัญหา "Tower of Brahma" (หอแห่งพรหม) ไม่มีข้อมูลเด่นชัดว่า ลูคาสนั้นเป็นผู้แต่งตำนานนี้ขึ้น หรือ ว่าได้รับแรงบันดาลใจจากตำนานนี้
หากตำนานนี้เป็นจริง และ พราหมณ์สามารถย้ายจานด้วยความเร็ว 1 ใบต่อวินาทีและใช้จำนวนครั้งการย้ายที่น้อยที่สุด เวลาทั้งหมดที่ใช้ในการแก้ปัญหานี้คือ 2⁶⁴ − 1 วินาที หรือ ประมาณ 585 พันล้านปี (อายุของจักรวาลในตอนนี้ ประมาณ 13.7 พันล้านปี)
นอกเหนือจากตำนานข้างต้นแล้ว ยังมีตำนานดัดแปลงอื่นๆ อีก เช่น ในบางเรื่องเล่าเป็นเรื่องของ วัด กับ พระ โดยที่วัดนั้นอยู่ในประเทศอื่น เช่นที่ เมืองฮานอย ในประเทศเวียดนาม ในบางเรื่องก็มีการเสริมเรื่องเล่าว่า หอคอยนั้นถูกสร้างขึ้นมาพร้อมการกำเนิดของโลก หรือ มีเงื่อนไขว่า พราหมณ์ หรือ พระ จะเคลื่อนย้ายจานได้เพียงวันละ 1 ใบ

คำตอบ

ของเล่นส่วนใหญ่จะมีจาน 8 ใบ เกมนี้จะดูเหมือนยากสำหรับผู้เริ่มเล่น แต่สามารถแก้ได้ด้วยขั้นตอนวิธีที่ไม่ซับซ้อน ดังนี้

ในทางปฏิบัติ

ทำการเคลื่อนย้ายจาน #1 และจานอื่นที่ใหญ่กว่า สลับกัน โดยที่หากมีจานใหญ่ 2 ใบที่สามารถย้ายได้ ให้ย้ายใบที่เล็กกว่าไปไว้บนใบที่ใหญ่กว่า ในการเคลื่อนย้าย ให้เคลื่อนจานที่มี หมายเลขคี่ ไปทางซ้ายทีละ 1 หมุด(จนสุดแล้ววนกลับมาเริ่มที่หมุดด้านขวา) และ จานที่มี หมายเลขคู่ ไปทางขวาทีละ 1 หมุด(จนสุดแล้ววนกลับมาเริ่มที่หมุดที่หมุดด้านซ้าย)
หรือที่ง่ายกว่านั้น คือ จะต้องย้ายจานใบเล็กที่สุด 1 ครั้ง หลังจากที่มีการย้ายจานอื่นทุกครั้ง โดยที่การย้ายจานใบเล็กนั้นจะย้ายไปในทิศทางเดียวกันตลอด หลังจากเคลื่อนย้ายจานใบเล็กแล้ว จะมีการเคลื่อนย้ายจานอื่น ที่ไม่ผิดกติกาให้ทำได้เพียงลักษณะเดียวเท่านั้น
ถึงแม้ว่า ขั้นตอนวิธีในการแก้ปัญหานั้นไม่ซับซ้อน แต่การแก้ปัญหาที่เร็วที่สุด สำหรับจาน n ใบนั้น ต้องใช้การย้ายถึง 2ⁿ−1 ครั้ง โดยทั่วไปแล้วในกรณีที่มีหมุดมากกว่า 3 หลักนั้น ไม่มีวิธีคำนวณหาจำนวนครั้งที่จำเป็นต้องใช้ในการแก้ปัญหา และวิธีการนับจำนวนครั้งสำหรับกรณีที่มีจานจำนวนมากก็ไม่สามารถทำได้ในทางปฏิบัติ

รหัสเกรย์

รหัสเกรย์ (Gray code) ซึ่งเป็นระบบตัวเลขฐานสองแบบหนึ่ง เป็นรูปแบบจำลองอีกแบบหนึ่งซึ่งสามารถใช้ในการแก้ปัญหา ในระบบรหัสเกรย์นั้น ตัวเลขจะเขียนอยู่ในรูปผสมของตัวเลข 0 และ 1 แต่จะแตกต่างเลขฐานสองมาตรฐาน โดยรหัสเกรย์ สำหรับแทนตัวเลขที่อยู่ถัดกัน จะต่างกันเพียง 1 บิตเท่านั้น จำนวนบิตที่ใช้ในรหัสเกรย์นั้นมีความสำคัญ รวมทั้งเลขศูนย์ที่อยู่นำหน้าก็ม่ความสำคัญ (ซึ่งต่างจากเลขฐานสองมาตรฐานที่เลขศูนย์ที่อยู่นำหน้านั้นไม่มีความสำคัญ)
หากจำนวนบิตของรหัสเกรย์ เท่ากับจำนวนจานในเกม และเริ่มนับจากศูนย์ เพิ่มขึ้นเรื่อยๆ บิตที่เปลี่ยนไปในการนับแต่ละขั้น ก็คือการย้ายจาน โดยบิตที่ค่าความสำคัญน้อยที่สุด คือจานใบเล็กที่สุด และ บิตที่มีค่าความสำคัญมากที่สุดคือ จานใบใหญ่ที่สุด
วิธีนี้บอกว่าจานใบไหนถูกย้าย แต่ไม่ได้บอกว่าย้ายไปที่ไหน กฎของการย้ายจะเป็นตัวบอกการย้าย โดยการย้ายจานนั้น จานที่มีภาวะคู่หรือคี่ (parity) เหมือนกันจะไม่วางซ้อนทับกัน (คือ จานเลขคู่ จะไม่ย้ายไปวางบนหมุดที่มีจานเลขคู่อยู่ด้านบนสุด จานเลขคี่ ก็จะไม่ย้ายไปวางบนจานเลขคี่) หากเราทำการย้ายตากกฎนี้ก็จะไม่เกิดความสับสนของตำแหน่งที่จะต้องย้ายจานไปวาง