Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

एक भूलभुलैया में चूहे के लिए सी कार्यक्रम - बैकट्रैकिंग -2?

भूलभुलैया में चूहा भी एक लोकप्रिय समस्या है जो बैकट्रैकिंग का उपयोग करती है। मैं

भूलभुलैया एक 2डी मैट्रिक्स है जिसमें कुछ कोशिकाएं अवरुद्ध होती हैं। कोशिकाओं में से एक स्रोत सेल है, जहां से हमें शुरू करना है। और उनमें से एक दूसरी मंजिल है, जहां हमें पहुंचना है। हमें किसी भी अवरुद्ध सेल में जाए बिना स्रोत से गंतव्य तक का रास्ता खोजना होगा। एक अनसुलझी भूलभुलैया का चित्र नीचे दिखाया गया है।

एक भूलभुलैया में चूहे के लिए सी कार्यक्रम - बैकट्रैकिंग -2?

और यही इसका समाधान है।

एक भूलभुलैया में चूहे के लिए सी कार्यक्रम - बैकट्रैकिंग -2?

इस पहेली को हल करने के लिए, हम पहले स्रोत सेल से शुरू करते हैं और उस दिशा में आगे बढ़ते हैं जहां पथ अवरुद्ध नहीं है। अगर रास्ता लिया जाए तो हम मंजिल तक पहुंच जाते हैं तो पहेली सुलझ जाती है। नहीं तो हम वापस आ जाते हैं और अपने द्वारा लिए गए रास्ते की दिशा बदल देते हैं। हम उसी तर्क को अपने कोड में भी लागू करने जा रहे हैं।

Input:
maze[][] = {
{0,1,0,1,1},
{0,0,0,0,0},
{1,0,1,0,1},
{0,0,1,0,0},
{1,0,0,1,0}}

Output:
1 0 0 0 0
1 1 1 1 0
0 0 0 1 0
0 0 0 1 1
0 0 0 0 1

स्पष्टीकरण

सबसे पहले, हम भूलभुलैया का प्रतिनिधित्व करने के लिए एक मैट्रिक्स बनाएंगे, और मैट्रिक्स के तत्व या तो 0 या 1 होंगे। 1 अवरुद्ध सेल का प्रतिनिधित्व करेगा और 0 उन कोशिकाओं का प्रतिनिधित्व करेगा जिनमें हम स्थानांतरित हो सकते हैं। ऊपर दिखाए गए भूलभुलैया के लिए मैट्रिक्स है:

0 1 0 1 1
0 0 0 0 0
1 0 1 0 1
0 0 1 0 0
1 0 0 1 0

अब, हम समाधान को संग्रहीत करने के लिए उसी आयाम का एक और मैट्रिक्स बनाएंगे। इसके तत्व भी 0 या 1 होंगे। 1 हमारे पथ में कोशिकाओं का प्रतिनिधित्व करेगा और शेष कोशिकाएं 0 होंगी। समाधान का प्रतिनिधित्व करने वाला मैट्रिक्स है:

1 0 0 0 0
1 1 1 1 0
0 0 0 1 0
0 0 0 1 1
0 0 0 0 1

इस प्रकार, अब हमारे पास हमारे मैट्रिक्स हैं। इसके बाद, हमें स्रोत सेल से गंतव्य सेल तक का रास्ता मिलेगा और हम जो कदम उठाएंगे वे हैं:

  • वर्तमान सेल की जाँच करें, यदि यह गंतव्य सेल है, तो पहेली हल हो जाती है।

  • यदि नहीं, तो हम नीचे की ओर बढ़ने की कोशिश करेंगे और देखेंगे कि हम नीचे की ओर जाने वाले सेल में जा सकते हैं या नहीं (सेल में जाने के लिए यह खाली होना चाहिए और पहले से ही पथ में मौजूद नहीं होना चाहिए)।

  • अगर हम वहां जा सकते हैं, तो हम अगले डाउनवर्ड सेल में ले जाने वाले रास्ते पर चलते रहेंगे।

  • यदि नहीं, तो हम दाएँ कक्ष में जाने का प्रयास करेंगे। और अगर इसे ब्लॉक या लिया गया है, तो हम ऊपर की ओर बढ़ेंगे।

  • इसी तरह, अगर हम ऊपर भी नहीं जा सकते हैं, तो हम बस बाएं सेल में चले जाएंगे।

  • यदि चार चालों (नीचे, दाएं, ऊपर, या बाएं) में से कोई भी संभव नहीं है, तो हम बस वापस चले जाएंगे और अपना वर्तमान पथ (बैकट्रैकिंग) बदल देंगे।

इस प्रकार, सारांश यह है कि हम वर्तमान सेल से दूसरे सेल (नीचे, दाएं, ऊपर और बाएं) में जाने की कोशिश करते हैं और यदि कोई गति संभव नहीं है, तो बस वापस आएं और पथ की दिशा को दूसरे सेल में बदलें।

Printsolution → यह फ़ंक्शन केवल सॉल्यूशन मैट्रिक्स को प्रिंट कर रहा है।

सॉल्वमेज़ → यह वास्तविक कार्य है जहाँ हम बैकट्रैकिंग एल्गोरिथम को लागू कर रहे हैं। सबसे पहले, हम अपने सेल की जाँच कर रहे हैं कि गंतव्य सेल है या नहीं (r==SIZE-1) और (c==SIZE-1)। यदि यह गंतव्य सेल है तो हमारी पहेली पहले ही हल हो चुकी है। यदि नहीं, तो हम जांच कर रहे हैं कि यह स्थानांतरित करने के लिए एक वैध सेल है या नहीं। एक वैध सेल मैट्रिक्स में होना चाहिए यानी, इंडेक्स 0 से SIZE-1 r>=0 &&c>=0 &&r

उदाहरण

#include <iostream>
using namespace std;
#define SIZE 5
//the maze problem
int maze[SIZE][SIZE] = {
   {0,1,0,1,1},
   {0,0,0,0,0},
   {1,0,1,0,1},
   {0,0,1,0,0},
   {1,0,0,1,0}
};
//matrix to store the solution
int solution[SIZE][SIZE];
//function to print the solution matrix
void printsolution() {
   int i,j;
   for(i=0;i<SIZE;i++) {
      for(j=0;j<SIZE;j++) {
         printf("%d\t",solution[i][j]);
      }
      printf("\n\n");
   }
}
//function to solve the maze
//using backtracking
int solvemaze(int r, int c) {
   //if destination is reached, maze is solved
   //destination is the last cell(maze[SIZE-1][SIZE-1])
   if((r==SIZE-1) && (c==SIZE-1) {
      solution[r][c] = 1;
      return 1;
   }
   //checking if we can visit in this cell or not
   //the indices of the cell must be in (0,SIZE-1)
   //and solution[r][c] == 0 is making sure that the cell is not already visited
   //maze[r][c] == 0 is making sure that the cell is not blocked
   if(r>=0 && c>=0 && r<SIZE && c<SIZE && solution[r][c] == 0 && maze[r][c] == 0){
      //if safe to visit then visit the cell
      solution[r][c] = 1;
      //going down
      if(solvemaze(r+1, c))
         return 1;
      //going right
      if(solvemaze(r, c+1))
         return 1;
      //going up
      if(solvemaze(r-1, c))
         return 1;
      //going left
      if(solvemaze(r, c-1))
         return 1;
      //backtracking
      solution[r][c] = 0;
      return 0;
   }
   return 0;
}
int main() {
   //making all elements of the solution matrix 0
   int i,j;
   for(i=0; i<SIZE; i++) {
      for(j=0; j<SIZE; j++) {
         solution[i][j] = 0;
      }
   }
   if (solvemaze(0,0))
      printsolution();
   else
      printf("No solution\n");
   return 0;
}

  1. सी एक समांतर चतुर्भुज की परिधि के लिए कार्यक्रम

    हमें समांतर चतुर्भुज की भुजाएँ दी गई हैं और कार्य एक समांतर चतुर्भुज की परिधि को उसके दिए गए पक्षों के साथ उत्पन्न करना और परिणाम प्रदर्शित करना है समांतर चतुर्भुज क्या है? समांतर चतुर्भुज एक प्रकार का द्विघात है जिसमें - विपरीत पक्ष समानांतर विपरीत कोण बराबर बहुभुज के विकर्ण एक दूसरे को समद्विभाज

  1. कॉस (x) श्रृंखला के योग के लिए सी कार्यक्रम

    हमें x और n के मान के साथ दिया गया है, जहां x, cos के लिए कोण है और n cos(x) श्रृंखला में पदों की संख्या है। Cos(x) के लिए Cos(x) एक त्रिकोणमितीय फलन है जिसका उपयोग x कोण के मान की गणना करने के लिए किया जाता है। फॉर्मूला $$\cos (x) =\displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k}}{(2k!)}x^{

  1. C . में क्रिसमस ट्री के लिए कार्यक्रम

    यहां हम एक दिलचस्प समस्या देखेंगे। इस समस्या में, हम देखेंगे कि क्रिसमस ट्री को बेतरतीब ढंग से कैसे प्रिंट किया जाए। तो पेड़ क्रिसमस ट्री की रोशनी की तरह टिमटिमाएगा। क्रिसमस ट्री को प्रिंट करने के लिए, हम विभिन्न आकारों के पिरामिडों को एक दूसरे के ठीक नीचे प्रिंट करेंगे। सजावटी पत्तियों के लिए दी ग