c++ - Why this Dijkstra (graph) implementation isn't working? -
मैंने इस समस्या के लिए यह कार्यान्वयन किया:
# शामिल & lt; iostream & gt; # से & lt में शामिल हैं, stdio.h & gt; # से & lt शामिल हैं; कतार & gt; # से & lt में शामिल हैं, conio.h & gt; # से & lt में शामिल हैं, string.h & gt; नेमस्पेस एसटीडी का उपयोग करना; संरचना नोड {int x; Int y; इंट टाइम; }; बूल ऑपरेटर & lt; (कॉन्स्ट नोड एंड कंस्ट्रक्शन नोड & amp; आर) (यदि (एस.टाइम & gt; आर। टाइम) रिटर्न सही; दूसरा झूठी वापसी; } नोड हेग, सैर, डेस्ट, टेम्पपा; Int b, a, temp; इंट मैप [25] [25]; बुल विज़ [25] [25]; Int x [] = {1,0, -1,0}; Int y [] = {0,1,0, -1}; Int djs_bfs (नोड स्रोत, नोड डेस्ट) {int परिणाम = 0; priority_queue & LT; नोड & gt; pq; pq.push (एसआरसी); जबकि (! Pq.empty ()) {नोड शीर्ष = pq.top (); pq.pop (); अगर (top.x == dest.x और amp; top.y == dest.y) रिटर्न परिणाम; यदि (top.x & lt; 0; top.x & gt; = ए) जारी; अगर (top.y & lt; 0; top.y & gt; = बी) जारी रहेगा; यदि (वी.ई.एस. [top.x] [top.y]) जारी रहेगा; विज़ [top.x] [top.y] सच =; परिणाम + = नक्शा [top.x] [top.y]; (इंट आई = 0; आई & lt; 4; i ++) के लिए {tempa.x = top.x + X [0]; tempa.y = top.y + Y [0]; tempa.time = नक्शा [top.x + X [0]] [top.y + Y [0]]; pq.push (tempa); }} वापसी -1; } एंट मुख्य () {मेमेसेट (वीज़ा, झूठी, आकार (वीज़ा)); Scanf ("% d% d", & amp; a; & amp; amp; b); जबकि (a! = 0) {for (int i = 0; i & lt; a; i ++) के लिए (int j = 0; j & lt; b; j ++) {scanf ("% c", और temp); यदि (temp == 'X') {नक्शा [i] [j] = 0; vis [i] [j] = सच;} अगर (temp == 'एस') {src.x = i; src.y = J; src.time = 0;} यदि (temp == 'D') {dest.x = i; dest.y = j; dest.time = 0;} दूसरा नक्शा [i] [j] = temp- '0'; } Cout & lt; & lt; djs_bfs (src, dest) & lt; & lt; endl; Scanf ("% d% d", & amp; a; & amp; amp; b); } वापसी 0; getch (); }
मुझे नहीं पता कि मेरा कोड परीक्षण के लिए सही उत्तर क्यों नहीं उत्पन्न करता है। यदि कोई मुझे कोड सुधारने में मदद कर सकता है, तो कृपया ऐसा करें: डी
सबसे पहले, ग्राफ पार्सिंग कोड गलत है पहली पंक्ति चौड़ाई और ऊंचाई निर्दिष्ट करती है, जहां चौड़ाई प्रति पंक्ति वर्णों की संख्या होती है, ऊँचाई लाइनों की संख्या होती है इसलिए, पहले scanf में स्वैप & amp; a
और & amp; b
, या नेस्टेड के लिए
loops के आदेश को स्वैप करें (लेकिन दोनों नहीं) । इसके अलावा, मुझे डमी scanf ("% c", और डमी) जोड़ना पड़ा;
न्यूलाइंस को फ़िल्टर करने के लिए विभिन्न स्थानों पर कॉल करें। एक सरल डंप, जैसे कि, यह निर्धारित करने में मदद करेगा कि आपका नक्शा सही ढंग से पार्स किया गया था:
cout & lt; & lt; "ए =" & lt; & lt; एक & lt; & lt; endl; Cout & lt; & lt; "बी =" & lt; & lt; बी एंड एलटी; & lt; endl; के लिए (इंट आई = 0; आई & lt; a; i ++) {के लिए (इंट जे = 0; जे एंड एलटी; बी; जे ++) {सीओएटी & एलटी; & lt; (चार) ('0' + नक्शा [i] [j]) & lt; & lt; ""; } Cout & lt; & lt; endl; }
नोट: मैंने भी मैप [i] [j]
को 'एस' और 'डी' के लिए सेट कर दिया है, फिर भी दोहराया बदलता है
बयान एक में अगर; और अगर; अन्य
श्रृंखला यह एल्गोरिदम को और अधिक मजबूत बनाता है, क्योंकि आप सामान्य तौर पर स्रोत या गंतव्य से समय जोड़ सकते हैं।
अब, खुद एल्गोरिदम पर ....
एल्गोरिथ्म वेतनमान के प्रत्येक लूप वर्तमान मानचित्र स्थान के वजन से परिणाम
। हालांकि, एल्गोरिथ्म एक साथ कई रास्ते खोज रहा है (यानी, प्राथमिकता कतार में प्रविष्टियों की संख्या), और इसलिए परिणाम
सभी संसाधित नोड भार का योग समाप्त होता है, वर्तमान पथ भार नहीं। वर्तमान पथ भार top.temp
है, और इसलिए आप परिणाम
चर को समाप्त कर सकते हैं और बस जब आप गंतव्य तक पहुंच जाते हैं तो top.temp
वापस कर सकते हैं।
इसके अलावा, जैसा कि अन्य उत्तर दिये गये हैं, आपको अपने आंतरिक पाश में X [i]
और वाई [i]
का उपयोग करने की आवश्यकता है, अन्यथा आप केवल एक दिशा में खोज।
अब, संदर्भ के लिए न्यूनतम सुधारों के साथ, यहां एल्गोरिथ्म का मेरा संस्करण है: मुझे आशा है कि यह मदद करता है। एक्स [i]
और वाई [i]
से जोड़ / घटाव के कारण, आप की संभावना < कोड> नक्शा [] [] सीमा से बाहर (-1 या 25)। इसलिए, मैं यदि
को लूप के बाहर के रेंज के उपयोग से बचाने के लिए आंतरिक गार्डों को ले जाने की सलाह देता हूं। यह भी अवैध संभावनाओं के साथ प्राथमिकता कतार भरने से बचा जाता है।
priority_queue & lt; node & gt; pq; pq.push (एसआरसी); जबकि (! Pq.empty ()) {नोड शीर्ष = pq.top (); pq.pop (); अगर (top.x == dest.x & amp; top.y == dest.y) शीर्ष पर वापस लौटें। समय; यदि (वी.ई.एस. [top.x] [top.y]) जारी रहेगा; विज़ [top.x] [top.y] सच =; (इंट आई = 0; आई & lt; 4; i ++) के लिए {tempa.x = top.x + X [i]; tempa.y = top.y + Y [i]; अगर (tempa.x & lt; 0 || tempa.x & gt; = एक) जारी; अगर (tempa.y & lt; 0 || tempa.y & gt; = बी) जारी रहेगा; Tempa.time = top.time + नक्शा [tempa.x] [tempa.y]; pq.push (tempa); }} वापसी -1;
Comments
Post a Comment