Puzzling.SE में हमारे दोस्तों पर , निम्नलिखित पहेली पोस्ट की गई थी: क्या यह रंगीन पहेली हमेशा हल है? एडगर जी। द्वारा आप इसे यहाँ खेल सकते हैं ।
पहेली की व्याख्या
m x n
तीन अलग-अलग रंगों की टाइलों के साथ एक ग्रिड को देखते हुए , आप किसी भी दो आसन्न टाइल्स का चयन कर सकते हैं , अगर उनके रंग अलग - अलग हों । फिर इन दो टाइलों को तीसरे रंग में बदल दिया जाता है, अर्थात, इन दो टाइलों द्वारा प्रतिनिधित्व नहीं किया जाने वाला एक रंग। यदि सभी टाइलों का रंग समान है, तो पहेली हल हो गई है । जाहिर है, कोई यह साबित कर सकता है कि यह पहेली हमेशा हल करने योग्य है, अगर 3 से न तो विभाज्य है m
और न ही n
।
बेशक, यह एक सुलझाने एल्गोरिथ्म के लिए भीख माँगता है। आप एक फ़ंक्शन या प्रोग्राम लिखेंगे जो इस पहेली को हल करता है। ध्यान दें कि 'साइड इफेक्ट्स' (यानी stdout
कुछ अजीब डेटा टाइप रिटर्न वैल्यू के बजाय आउटपुट चालू है ) के कार्य स्पष्ट रूप से अनुमत हैं।
इनपुट आउटपुट
इनपुट एक हो जाएगा m x n
पूर्णांकों से मिलकर मैट्रिक्स 1
, 2
और 3
(या 0
, 1
, 2
यदि सुविधाजनक)। आप इस इनपुट को किसी भी स्वरूप में ले सकते हैं। दोनों m
और 3 से विभाज्य नहीं n
हैं >1
। आप मान सकते हैं कि पहेली हल नहीं हुई है
फिर आप पहेली को हल करेंगे। इसमें दो आसन्न टाइलों के बार-बार चयन को 'रूपांतरित' किया जाना है (ऊपर देखें)। आप इन टाइलों के दो निर्देशांकों का उत्पादन करेंगे जो आपके हल किए गए एल्गोरिदम के प्रत्येक चरण के लिए हैं। यह भी किसी भी आउटपुट आउटपुट स्वरूप में हो सकता है। आप अपने निर्देशांक के 0-आधारित और 1-आधारित अनुक्रमण के बीच चयन करने के लिए स्वतंत्र हैं, और क्या पंक्तियों या स्तंभों को पहले अनुक्रमित किया गया है। कृपया अपने उत्तर में इसका उल्लेख करें।
आपका एल्गोरिथ्म मूल 8x8 मामले पर उचित समय के भीतर चलना चाहिए। ब्रूट-फोर्सिंग इसे पूरी तरह से अस्वीकार कर दिया गया है, अर्थात आपके एल्गोरिथ्म को समाधान के लिए आवश्यक चरणों की संख्या के O(k^[m*(n-1)+(m-1)*n])
साथ चलना चाहिए k
। हालांकि समाधान को इष्टतम होने की आवश्यकता नहीं है। लिंक किए गए प्रश्न में दिए गए प्रमाण से आपको यह अंदाजा हो सकता है कि यह कैसे करना है (उदाहरण के लिए, पहले सभी स्तंभ केवल लंबवत आसन्न टाइल्स का उपयोग करें, और फिर सभी पंक्तियों को करें)
परीक्षण के मामलों
इन परीक्षण मामलों में, निर्देशांक 1-आधारित होते हैं और पंक्तियों को पहले अनुक्रमित किया जाता है (जैसे MATLAB / ऑक्टेव और शायद कई अन्य)।
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]
यदि वांछित है, तो मैं बड़े परीक्षण मामलों के एक पेस्टबिन को पोस्ट कर सकता हूं, लेकिन मुझे लगता है कि यह पर्याप्त होना चाहिए।