algorithm - square puzzle solution -


प्रश्न: एक पूर्णांक संख्या दी गई है, संख्या को 1 से n से 2 प्रिंट करें :

n = 4

परिणाम है:

  01 02 03 04 12 13 14 05 11 16 15 06 10 09 08 07  

आप इसे कैसे हल करते हैं (नीचे दिए गए लिंक में दिए गए समाधान से अलग)?

मैं दूसरी दिशा में देख रहा हूं । अब तक, मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या मैं पदों की क्रमिक सूची प्राप्त कर सकता हूं जो मुझे भरने के लिए है।

यहां मैं क्या देख रहा हूं: "एफडीआईएसपी" प्राप्त करने का एक तरीका है मैट्रिक्स में "चलने" की बजाय इस समस्या को हल करने के लिए

  मैट्रिक्स = [[1, 2, 3, 4], [5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16]] n = लैन (मैट्रिक्स) # अंतिम स्वभाव हाथ से लिखा गया है: इसे मनमानी एन के लिए कैसे प्राप्त किया जाए? Fdisp = [(0,0), (0,1), (0,2), (0,3), (1,3), (2,3), (3,3), (3, 2) , (3,1), (3,0), (2,0), (1,0), (1,1), (1,2), (2,2), (2,1)] के लिए वैल, मैं एन्यूमरेट (एफडीआईएसपी): मैट्रिक्स [आई [0]] [आई [1]] = वेल + 1 डेफ शो मैट्रिक्स (मैट्रिक्स, एन): आई, एल के लिए मैट्रिक्स (मैट्रिक्स): श्रेणी में जी के लिए (एन ): प्रिंट "% d \ t"% मैट्रिक्स [i] [जे], प्रिंट शो_मैट्रिक्स (मैट्रिक्स, एन)  

यहां एक अलग दृष्टिकोण है यह खोलने पर निर्भर करता है कि आप जो आंदोलनों के बीच चक्र बनाते हैं: दाएं, नीचे, बाएं, ऊपर, दाएं, .... आगे, आपके द्वारा कितनी बार चले जाते हैं: 3 सही, 3 नीचे, 3 बायां, 2 ऊपर, 2 सही , 1 नीचे, 1 बाएं तो आगे की हलचल के बिना, मैं इसे पायथन में कोड करूंगा।

सबसे पहले, मैं कुछ इटेरटोल्स और कुछ अंडाकार का प्रयोग करूँगा:

  इटरेटोल्स आयात श्रृंखला, चक्र, आईएमएपी, Izip, numpy आयात सरणी से दोहराएँ  

दिशाओं चक्र के बीच: दाएं, नीचे, बाएं, ऊपर, दाएं, ...:

  दिशाओं = चक्र ((0,1), (1,0), (0, -1), (- 1,0)) में v के लिए (सरणी (v) () ( 

(मैं ' एमएमपी के एरे का उपयोग कर रहा हूँ ताकि मैं आसानी से एक साथ दिशाएं जोड़ सकूं। ट्यूपल्स अच्छी तरह से जोड़ नहीं सकते।)

इसके बाद, मैं कई बार एन-1 से 1 की ओर जाता हूं, दो बार दो बार दोहराता हूं, और पहले नंबर तीन बार:

  उलटी गिनती = चेन ((n-1,), * imap (दोहराने, श्रेणी (एन -1.0, -1), दोहराने (2)) )  

तो अब निर्देशों का अनुक्रम मेरी उलटी गिनती में युग्मित नंबर द्वारा प्रत्येक अगली दिशा को दोहरा कर बनाया जा सकता है:

  dirseq = chain (* imap दोहराने, दिशाएं, उलटी गिनती))  

मेरे अनुक्रमों के अनुक्रम पाने के लिए, मैं इस क्रम को जोड़ सकता हूं, लेकिन (एएफए IK) पायथन ऐसी कोई विधि प्रदान नहीं करता है, तो चलो जल्दी से एक साथ फेंक दें:

  def sumseq (seq, start = 0): v = शुरुआत में s के लिए उपज v: v + मूल आरेख को बनाने के लिए, मैं निम्नलिखित कर सकता हूँ:  
  a = सरणी (((,,, * n)) * N) # एन-बाय-एन ज़रेओ के सरणी के लिए I, v में गणना (sumseq (dirseq, array ((0,0))): a [v [0], v [1]] = i + 1 प्रिंट करें  

जो, ​​n = 4 के लिए देता है:

  [[1 2 3 4] [12 13 14 5] [11 16 15 6 ] [10 9 8 7]]  

और, के लिए n = 5, देता है:

  [[1 2 3 4 5] [16 17 18 1 9 6] [15 24 25 20 7] [14 23 22 21 8] [13 12 11 10 9]]  

इस दृष्टिकोण को आयताकार ग्रिड में सामान्यीकृत किया जा सकता है; मैं इसे रीडर के लिए एक व्यायाम के रूप में छोड़ देता हूं;)


Comments

Popular posts from this blog

email - PHP mail error ... failed to open stream : permission denied -

c# - ListView onScroll event -

c - Linux mmap() error -