क्रमबद्ध संख्याओं की अदला-बदली करके संख्याओं से भरे दो-आयामी सरणी को क्रमबद्ध [बंद]


9

आकार n × n का द्वि-आयामी सरणी n * n संख्याओं से भरा होता है, नंबर 1 से शुरू होता है। उन संख्याओं को आरोही क्रम में प्रति पंक्ति क्रमबद्ध किया जाना है; पंक्ति की पहली संख्या पिछली पंक्ति की अंतिम संख्या से अधिक होनी चाहिए (सभी की सबसे छोटी संख्या (1) [0,0] में होगी)। यह 15 पज़ल के समान है ।

यह, उदाहरण के लिए, आकार n = 3 का एक सॉर्ट किया गया सरणी है ।

1 2 3
4 5 6
7 8 9

इनपुट

इनपुट एक तले हुए सरणी है। यह n = 10. तक किसी भी आकार का हो सकता है। n = 3 के लिए उदाहरण

4 2 3
1 8 5
7 9 6

उत्पादन

सरणी को सॉर्ट करने के लिए आवश्यक स्वैप की सूची आउटपुट करें । एक स्वैप को निम्नलिखित के रूप में परिभाषित किया गया है: दो आसन्न संख्याएं स्वैप स्थिति, या तो क्षैतिज या लंबवत; विकर्ण स्वैपिंग की अनुमति नहीं है।

ऊपर दिए गए उदाहरण के लिए उदाहरण आउटपुट:

  • स्वैप 4 और 1
  • स्वैप 8 और 5
  • स्वैप 8 और 6
  • स्वैप ९ और 8

कम स्वैप आवश्यक, बेहतर। गणना समय संभव होना चाहिए।


यहाँ n = 10 के साथ एक और उदाहरण इनपुट है:

41 88 35 34 76 44 66 36 58 28
6 71 24 89 1 49 9 14 74 2
80 31 95 62 81 63 5 40 29 39
17 86 47 59 67 18 42 61 53 100
73 30 43 12 99 51 54 68 98 85
13 46 57 96 70 20 82 97 22 8
10 69 50 65 83 32 93 45 78 92
56 16 27 55 84 15 38 19 75 72
33 11 94 48 4 79 87 90 25 37
77 26 3 52 60 64 91 21 23 7

अगर मैं गलत नहीं हूं, तो इसके लिए लगभग 1000-2000 स्वैप की आवश्यकता होगी।


क्या यह एक पहेली, गति, या गोल्फ समस्या है?
माइकल क्लेन

@MichaelKlein यह एक पहेली है।
JCarter

क्या यह रन बनाए हैं? किन श्रेणियों को संभालने की आवश्यकता है?
माइकल क्लेन

1
@steveverrill मुझे डर है कि 100 से कम स्वैप (या यहां तक ​​कि 1000 में n = 10 उदाहरण को हल करना काफी असंभव है; लेकिन कृपया मुझे गलत साबित करें)। फिर भी, स्वैप की संख्या जीतने की कसौटी है (हालांकि गणना संभव होनी चाहिए!), वह जो सबसे कम संख्या में स्वैप जीत के साथ समाधान के साथ आता है।
जेसीटीर

1
@ जेसीटीआर मुझे लगता है कि आपके कहने का मतलब है कि केवल आसन्न संख्याओं की अदला-बदली हो सकती है?
क्विंटोपिया 15

जवाबों:


3

गणितज्ञ, गोल्फ नहीं

towards[a_,b_]:={a,a+If[#==0,{0,Sign@Last[b-a]},{#,0}]&@Sign@First[b-a]};
f[m_]:=Block[{m2=Map[QuotientRemainder[#-1,10]+1&,m,{2}]},
  Rule@@@Apply[10(#1-1)+#2&,#,{2}]&@
    Reap[Table[
      m2=NestWhile[
        Function[{x},x/.(Sow[#];Thread[#->Reverse@#])&[x[[##]]&@@@towards[First@Position[x,i,{2}],i]]]
        ,m2,#~Extract~i!=i&];
      ,{i,Reverse/@Tuples[Range[10],2]}];][[2,1]]]

स्पष्टीकरण :

एल्गोरिथ्म "बबल सॉर्ट" के समान है। इन 100 नंबरों को एक-एक करके सही क्रम में रखा जाता है 1, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100। वे पहले सही पंक्तियों में ऊपर / नीचे जाते हैं, और फिर बाएं से दाएं स्तंभों पर जाते हैं।

फंक्शन towardsस्वैप करने के लिए दो स्थिति देता है। उदाहरण के लिए, यदि {5,2}यह आगे बढ़ रहा है {1,1}, towards[{5,2},{1,1}]देता है {{5,2},{5,1}}(ऊपर जाता है); और towards[{5,1},{1,1}]देता है {{5,1},{4,1}}(लेफ्ट लेफ्ट)।


परिणाम :

परीक्षण मामले के लिए, स्वैप की कुल संख्या 558 है। पहले कुछ स्वैप हैं,

{1->76,1->34,1->35,1->88,1->41,11->16,11->69,11->46, ...

एक यादृच्छिक विन्यास के लिए, स्वैप की कुल संख्या 558.5 .3 28.3 (1।) है।

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.