यदि आप रूबिक क्यूब को हल करने के लिए सॉफ़्टवेयर विकसित कर रहे थे, तो आप घन का प्रतिनिधित्व कैसे करेंगे?कोड में रुबिक के घन का प्रतिनिधित्व कैसे करेंगे?
उत्तर
ऐसा करने के कई तरीके हैं। कुछ तरीकों से दूसरों की तुलना में स्मृति का अधिक कुशल उपयोग होता है।
मैंने देखा है लोगों को घनाभ वस्तुओं, जहां घनाभ वस्तु रंग जानकारी स्टोर करने की जरूरत है (और हाँ, कि केंद्र वस्तु इस्तेमाल कभी नहीं किया है) के एक 3 x 3 x 3 सरणी का उपयोग करें। मैंने लोगों को 6 सरणी का उपयोग किया है, जिनमें से प्रत्येक क्यूबोइड्स का 3 x 3 सरणी है। मैंने क्यूबोइड्स की 3 x 18 सरणी देखी है। कई संभावनाएं हैं।
शायद एक बड़ा चिंता का विषय विभिन्न रूपांतरण का प्रतिनिधित्व करने के लिए कैसे है। एक भौतिक घन के एक ही चेहरे को घुमाने (सभी घन चाल अनिवार्य रूप से एक ही चेहरे के घूर्णन होते हैं) को कई घनत्व वस्तुओं के चारों ओर स्वैप करके प्रतिनिधित्व करना होगा।
आपकी पसंद एक है कि जो कुछ भी आवेदन आप लिख रहे हैं के लिए समझ में आता है होना चाहिए। ऐसा हो सकता है कि आप केवल घन प्रस्तुत कर रहे हैं। ऐसा हो सकता है कि कोई यूआई नहीं है। आप घन को हल कर सकते हैं।
मैं 3 x 18 सरणी चुनूंगा।
दृश्य उपस्थिति पर ध्यान केंद्रित करने का एक तरीका होगा।
एक घन छह चेहरे है और प्रत्येक चेहरा वर्गों की एक तीन-दर-तीन सरणी है। तो
Color[][][] rubik = new Color[6][3][3];
फिर प्रत्येक चाल एक विधि है जो रंगीन वर्गों के एक विशिष्ट सेट को अनुमति देती है।
पर कौन से संचालन की आवश्यकता है, इस तरह मैंने उपयोग किया है। चेहरों को घूमना आसान बनाता है। 'new_cube [चेहरा] [i] [जे] = दक्षिणावर्त? old_cube [जे] [2 - i]: old_cube [2 - जे] [i]; } ' – azz
आप तीन ऊर्ध्वाधर परिपत्र जुड़ा हुआ सूचियों, जो तीन क्षैतिज जुड़ा हुआ सूचियों एक दूसरे को काटना के रूप में घन कल्पना कर सकता।
जब भी घन की एक निश्चित पंक्ति में घुमाया जाता है तुम सिर्फ इसी संकेत बारी बारी से होगा।
यह इस तरह दिखेगा:
struct cubeLinkedListNode {
cubedLinkedListNode* nextVertical;
cubedLinkedListNode* lastVertical;
cubedLinkedListNode* nextHorizontal;
cubedLinkedListNode* lastHorizontal;
enum color;
}
आप वास्तव में 2 'last'-संकेत आवश्यकता न पड़े।
[मैंने इसे सी के साथ किया था, लेकिन यह जावा या सी # में किया जा सकता है, बस क्यूबलिंक्ड लिस्ट नोड के लिए एक साधारण वर्ग का उपयोग करके, प्रत्येक कक्षा को अन्य नोड्स के संदर्भ में संदर्भित किया जा सकता है। ]
याद रखें कि छः इंटरलॉकिंग सर्कुलर लिंक्ड सूचियां हैं। 3 लंबवत 3 क्षैतिज।
प्रत्येक रोटेशन के लिए आप घूर्णन सर्कल के साथ-साथ कनेक्टिंग सर्किल के लिंक को अनुक्रमिक रूप से स्थानांतरित करने के लिए इसी सर्कुलर लिंक्ड सूची के माध्यम से लूप करेंगे।
कुछ ऐसे ही, कम से कम ...
20 cubies कि कोई फर्क नहीं हैं। तो ऐसा करने का एक तरीका 20 तारों की सरणी के रूप में है। तारों में रंगों को इंगित करने वाले 2 या 3 वर्ण होंगे। कोई भी चाल 7 घनियों को प्रभावित करती है। तो आपको केवल छह पक्षों में से प्रत्येक के लिए एक remapper की जरूरत है।
नोट: यह समाधान सफेद केंद्र पर लोगो स्टिकर के अभिविन्यास को याद रखने में सक्षम नहीं है।
वैसे, मैंने किसी को 15 साल पहले एक बार रुबिक के घन को सॉफ़्टवेयर करने में मदद की, लेकिन मुझे याद नहीं है कि हमने इसका प्रतिनिधित्व कैसे किया।
यह ACM Paper कई वैकल्पिक तरीकों का वर्णन करता है जिनका उपयोग रूबिक के घन का प्रतिनिधित्व करने के लिए किया जाता है और उन्हें एक दूसरे के खिलाफ तुलना करता है। अफसोस की बात है, मेरे पास पूरा पाठ प्राप्त करने के लिए कोई खाता नहीं है लेकिन विवरण बताता है:
रूबिक के घन के सात वैकल्पिक प्रतिनिधित्व प्रस्तुत और तुलना किए गए हैं: 3-3-3-3-3 सरणी 3- अंक पूर्णांक; अक्षर के 6-दर-3-दर-3 सरणी; एक 5-दर -12 शाब्दिक मैट्रिक्स; एक ll-by-ll sparse शाब्दिक मैट्रिक्स; एक 54-तत्व वेक्टर; एक 4 आयाम सरणी; और एक 3-दर-3-दर-3 नेस्टेड सरणी। एपीएल कार्यों को कूब को हल करने के लिए अभिविन्यास चाल और तिमाही-मोड़ के साथ-साथ कई उपयोगी टूल के लिए दिए जाते हैं।
इसके अलावा, इस RubiksCube.java फ़ाइल वर्गों (आप वास्तविक कोड की तलाश कर रहे हैं) घूर्णन के लिए प्रासंगिक कोड के साथ एक बहुत साफ प्रतिनिधित्व होता है। यह एक सेल और चेहरे सरणी का उपयोग करता है।
दूसरों को अच्छी तरह से भौतिक घन का वर्णन करने के लिए संबोधित किया गया है, लेकिन घन की स्थिति के बारे में ... मैं घन के परिवर्तनों का वर्णन करने के लिए वेक्टर परिवर्तनों की एक सरणी का उपयोग करने की कोशिश करता हूं। इस तरह आप रूबिक घन के इतिहास को बदल सकते हैं क्योंकि परिवर्तन किए जाते हैं। और मुझे आश्चर्य है कि क्या आप सबसे सरल समाधान खोजने के लिए वैक्टर को एक रूपांतरण मैट्रिक्स में गुणा कर सकते हैं?
48 चेहरे की क्रमपरिवर्तन के रूप में जो स्थानांतरित हो सकता है। मूल घूर्णन भी क्रमपरिवर्तन हैं, और क्रमपरिवर्तन बना सकते हैं, वे एक समूह बनाते हैं।
एक कार्यक्रम में इस तरह के एक क्रमचय संख्या 0 47. करने के लिए रंग संख्या के लिए इसी युक्त 48 तत्वों की एक सरणी का प्रतिनिधित्व करती हो जाएगा तय कर रहे हैं, तो एक दृश्य प्रतिनिधित्व क्रमचय से गणना की जा सकती, और इसके विपरीत।
घन का प्रतिनिधित्व करने के लिए एक दिलचस्प तरीका सॉफ़्टवेयर "क्यूब एक्सप्लोरर" द्वारा उपयोग किया जाता है। बहुत से चालाक गणित का उपयोग करना कि विधि केवल 5 पूर्णांक का उपयोग कर घन का प्रतिनिधित्व कर सकती है। लेखक अपने कार्यक्रम के पीछे गणित को website पर बताते हैं। लेखक के मुताबिक प्रतिनिधित्व तेजी से हल करने के लिए उपयुक्त है।
एस्चेव अनुकूलन; इसे ऑब्जेक्ट उन्मुख बनाओ। एक स्यूडोकोड वर्ग रूपरेखा मैं का उपयोग किया है है:
class Square
+ name : string
+ accronym : string
class Row
+ left_square : square
+ center_square : square
+ right_square : square
class Face
+ top_row : list of 3 square
+ center_row : list of 3 square
+ bottom_row : list of 3 square
+ rotate(counter_clockwise : boolean) : nothing
class Cube
+ back_face : face
+ left_face : face
+ top_face : face
+ right_face : face
+ front_face : face
+ bottom_face : face
- rotate_face(cube_face : face, counter_clockwise : boolean) : nothing
इस्तेमाल किया स्मृति की मात्रा इतना छोटा और प्रसंस्करण इतना कम है कि अनुकूलन पूरी तरह से अनावश्यक है, खासकर जब आप कोड प्रयोज्य बलिदान।
जोड़ा, जबकि "अनुकूलन" नहीं है, मुझे लगता है कि यह "ऑब्जेक्ट-उन्मुख ओवरथिंकिंग" है, कम से कम थोड़ा। वास्तव में इन विस्तृत चेहरों और पंक्तियों का उद्देश्य क्या है? एक चेहरा बस 9 वर्ग हो सकता है। यहां तक कि सरल, एक घन 54 वर्ग हो सकता है। घूर्णन प्राप्त करना मुश्किल है, किसी भी तरह से। –
यह इस बात पर निर्भर करता है कि आपको डेटा – stefanB