ที่เพื่อนของเราที่Puzzling.SEปริศนาต่อไปนี้ถูกโพสต์: ปริศนาสีนี้สามารถแก้ไขได้เสมอหรือไม่? โดยเอ็ดการ์กรัมคุณสามารถเล่นได้ที่นี่
คำอธิบายปริศนา
กำหนดm x n
ตารางด้วยกระเบื้องสามสีที่แตกต่างกันคุณอาจเลือกที่สองกระเบื้องที่อยู่ติดกันถ้าสีของพวกเขามีความแตกต่างกัน ไทล์ทั้งสองนี้จะถูกแปลงเป็นสีที่สามนั่นคือสีหนึ่งสีที่ไม่ได้เป็นตัวแทนจากไทล์ทั้งสองนี้ ปริศนาถูกแก้ไขถ้ากระเบื้องทั้งหมดมีสีเดียวกัน เห็นได้ชัดว่าใครสามารถพิสูจน์ได้ว่าปริศนานี้คือมักจะแก้ปัญหาได้ถ้าค่าm
มิได้n
มีหารด้วย 3
แน่นอนว่าสิ่งนี้จะทำให้เกิดอัลกอริทึมการแก้ปัญหา คุณจะเขียนฟังก์ชั่นหรือโปรแกรมที่แก้ปริศนานี้ โปรดทราบว่าฟังก์ชั่นที่มี 'ผลข้างเคียง' (เช่นเอาท์พุทเปิดอยู่stdout
แทนที่จะอยู่ในค่าส่งคืนชนิดข้อมูลที่น่าอึดอัดใจบางอย่าง) ได้รับอนุญาตอย่างชัดเจน
อินพุตและเอาต์พุต
การป้อนข้อมูลจะเป็นm x n
เมทริกซ์ประกอบด้วยจำนวนเต็ม1
, 2
และ3
(หรือ0
, 1
, 2
ถ้าสะดวก) คุณสามารถรับอินพุตนี้ในรูปแบบใด ๆ ก็ได้ ทั้งสองm
และn
มี>1
และไม่หารด้วย 3. คุณอาจจะสมมติปริศนาไม่ได้แก้ไข
จากนั้นคุณจะไขปริศนา สิ่งนี้จะเกี่ยวข้องกับการเลือกไพ่สองแผ่นติดกันซ้ำ ๆ เพื่อให้ 'แปลง' (ดูด้านบน) คุณจะแสดงพิกัดทั้งสองของไทล์เหล่านี้สำหรับแต่ละขั้นตอนวิธีแก้ปัญหาของคุณ นี่อาจเป็นรูปแบบเอาต์พุตที่มีสติก็ได้ คุณมีอิสระในการเลือกระหว่างการจัดทำดัชนีแบบอิง 0 และแบบ 1 จากพิกัดของคุณและไม่ว่าจะเป็นแถวหรือคอลัมน์จะถูกทำดัชนีก่อน โปรดพูดถึงสิ่งนี้ในคำตอบของคุณ
อัลกอริทึมของคุณควรทำงานภายในเวลาที่เหมาะสมในกรณี 8x8 ดั้งเดิม เดรัจฉานบังคับให้มันสมบูรณ์ไม่ได้รับอนุญาตอย่างชัดเจนเช่นอัลกอริทึมของคุณควรทำงานภายใต้O(k^[m*(n-1)+(m-1)*n])
กับk
จำนวนของขั้นตอนที่จำเป็นสำหรับการแก้ปัญหา วิธีการแก้ปัญหาไม่จำเป็นต้องดีที่สุด หลักฐานที่ให้ไว้ในคำถามที่เชื่อมโยงอาจทำให้คุณมีความคิดเกี่ยวกับวิธีการทำสิ่งนี้ (เช่นก่อนอื่นให้ทำคอลัมน์ทั้งหมดโดยใช้แผ่นกระเบื้องที่อยู่ติดกันในแนวตั้งจากนั้นทำทุกแถว)
กรณีทดสอบ
ในกรณีทดสอบเหล่านี้พิกัดที่ใช้ 1 และแถวจะถูกจัดทำดัชนีก่อน (เช่น MATLAB / Octave และอื่น ๆ อีกมากมาย)
Input:
[1 2]
Output: (result: all 3's)
[1 1],[1,2]
Input:
[ 1 2
3 1 ]
Output: (result: all 1's)
[1 1],[2 1] (turn left column into 2's)
[2 1],[2 2] (turn right column into 3's)
[1 1],[1 2] (turn top row into 1's)
[2 1],[2 2] (turn bottom row into 1's)
Input:
[1 2 3 2
3 2 1 1]
Output: (result: all 3's)
[1 1],[1 2]
[1 3],[1 4]
[1 2],[1 3]
[1 1],[1 2]
[1 2],[1 3]
[1 1],[1 2]
[1 3],[1 4]
[2 1],[2 2]
[1 1],[2 1]
[1 2],[2 2]
[1 3],[2 3]
[1 4],[2 4]
หากต้องการฉันอาจโพสต์ pastebin ของกรณีทดสอบที่ใหญ่กว่า แต่ฉันคิดว่ามันน่าจะเพียงพอ