Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में बारूदी सुरंग वाले पथ में सबसे छोटा सुरक्षित मार्ग खोजें

इस समस्या में, हमें एक मैट्रिक्स मैट [] [] दिया जाता है। यह बारूदी सुरंगों के साथ एक पथ को परिभाषित करता है जिसे 0 के रूप में चिह्नित किया जाता है। हमारा काम बारूदी सुरंगों के साथ पथ में सबसे छोटा सुरक्षित मार्ग खोजना है।

सुरक्षित रास्ते से गुजरते समय, हमें असुरक्षित होने के कारण बारूदी सुरंग (बाएं, दाएं, ऊपर और नीचे) के आस-पास की कोशिकाओं पर चलने से बचना चाहिए।

पथ को पार करते समय सभी मान्य चालें हैं -

- Left : mat[i][j] => mat[i-1][j]
- Right : mat[i][j] => mat[i+1][j]
- Top : mat[i][j] => mat[i][j - 1]
- Bottom : mat[i][j] => mat[i][j + 1]

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट

mat[][] = {
   {1, 1, 0, 1},
   {1, 1, 0, 1},
   {1, 1, 1, 1},
   {1, 1, 1, 1}
}

आउटपुट

length of shortest safe path is 7

स्पष्टीकरण

{
   {1, 1, 0, 1},
   {1, 1, 0, 1},
   {1, 1, 1, 1},
   {1, 1, 1, 1}
}

समाधान दृष्टिकोण

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

एल्स रिटर्न -1, यह दर्शाता है कि कोई रास्ता नहीं मिला

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,

उदाहरण

#include <bits/stdc++.h>
using namespace std;
#define R 11
#define C 10
int rowNum[] = { -1, 0, 0, 1 };
int colNum[] = { 0, -1, 1, 0 };
bool isSafe(int mat[R][C], int isvisited[R][C], int x, int y){
   if (mat[x][y] == 0 || isvisited[x][y])
      return false;
   return true;
}
bool isValid(int x, int y){
   if (x < R && y < C && x >= 0 && y >= 0)
      return true;
   return false;
}
void unSafeCellsInPath(int mat[R][C]){
   for (int i = 0; i < R; i++){
      for (int j = 0; j < C; j++){
         if (mat[i][j] == 0){
            for (int k = 0; k < 4; k++)
               if (isValid(i + rowNum[k], j + colNum[k]))
            mat[i + rowNum[k]][j + colNum[k]] = -1;
         }
      }
   }
   for (int i = 0; i < R; i++) {
      for (int j = 0; j < C; j++){
         if (mat[i][j] == -1)
            mat[i][j] = 0;
      }
   }
}
void findShortestSafeRouteRec(int mat[R][C], int isvisited[R][C], int i, int j, int &min_dist, int dist){
   if (j == C-1){
      min_dist = min(dist, min_dist);
      return;
   }
   if (dist > min_dist)
      return;
   isvisited[i][j] = 1;
   for (int k = 0; k < 4; k++){
      if (isValid(i + rowNum[k], j + colNum[k]) && isSafe(mat, isvisited, i + rowNum[k], j + colNum[k])){
         findShortestSafeRouteRec(mat, isvisited, i + rowNum[k], j + colNum[k], min_dist, dist + 1);
      }
   }
   isvisited[i][j] = 0;
}
int findShortestSafeRoute(int mat[R][C]){
   int minSafeDist = INT_MAX;
   int isvisited[R][C];
   unSafeCellsInPath(mat);
   for (int i = 0; i < R; i++) {
      if (mat[i][0] == 1) {
         memset(isvisited, 0, sizeof isvisited);
         findShortestSafeRouteRec(mat, isvisited, i, 0, minSafeDist, 0);
         if(minSafeDist == C - 1)
            break;
      }
   }
   if (minSafeDist != INT_MAX)
      return minSafeDist;
   else
      return -1;
}
int main() {
   int mat[R][C] =
   {
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 0, 1, 1, 1, 1, 1, 1, 0, 1 },
      { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 0, 1, 1 },
      { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }
   };
   int pathLen = findShortestSafeRoute(mat);
   if(pathLen == -1)
      cout<<"No Safe Path from source to destination possible!";
   else
      cout<<"Shortest Safe route Length is "<<pathLen;
   return 0;
}

आउटपुट

Shortest Safe route Length is 10

वैकल्पिक समाधान

समस्या का एक वैकल्पिक समाधान चौड़ाई पहली खोज का उपयोग कर रहा है। कतार का उपयोग करके, हम पहले कॉलम से अंतिम कॉलम तक का रास्ता खोज लेंगे और फिर पहले कॉलम से आखिरी कॉलम तक के पथ के लिए न्यूनतम दूरी लौटा देंगे।

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,

उदाहरण

#include <bits/stdc++.h>
using namespace std;
#define R 11
#define C 10
int rowNum[] = { -1, 0, 0, 1 };
int colNum[] = { 0, -1, 1, 0 };
struct Key{
   int x,y;
   Key(int i,int j){ x=i;y=j;};
};
bool isValid(int x, int y) {
   if (x < R && y < C && x >= 0 && y >= 0)
      return true;
   return false;
}
int findShortestSafeRoute(int mat[R][C]){
   for (int i = 0; i < R; i++) {
      for (int j = 0; j < C; j++) {
         if (mat[i][j] == 0) {
            for (int k = 0; k < 4; k++)
               if (isValid(i + rowNum[k], j + colNum[k]))
                  mat[i + rowNum[k]][j + colNum[k]] = -1;
         }
      }
   }
   for (int i = 0; i < R; i++) {
      for (int j = 0; j < C; j++) {
         if (mat[i][j] == -1)
            mat[i][j] = 0;
      }
   }
   int visited[R][C];
   for(int i=0;i<R;i++){
      for(int j=0;j<C;j++)
         visited[i][j] = -1;
   }
   queue<Key> distQueue;
   for(int i=0;i<R;i++){
      if(mat[i][0] == 1){
         distQueue.push(Key(i,0));
         visited[i][0] = 0;
      }
   }
   while(!distQueue.empty()){
      Key k = distQueue.front();
      distQueue.pop();
      int d = visited[k.x][k.y];
      int x = k.x;
      int y = k.y;
      for (int k = 0; k < 4; k++) {
         int xp = x + rowNum[k];
         int yp = y + colNum[k];
         if(isValid(xp,yp) && visited[xp][yp] == -1 && mat[xp][yp] == 1){
            visited[xp][yp] = d+1;
            distQueue.push(Key(xp,yp));
         }
      }
   }
   int pathLen = INT_MAX;
   for(int i=0;i<R;i++){
      if(mat[i][C-1] == 1 && visited[i][C-1] != -1){
         pathLen = min(pathLen,visited[i][C-1]);
      }
   }
   if(pathLen == INT_MAX)
      return -1;
   else
      return pathLen;
}
int main() {
   int mat[R][C] =
   {
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 0, 1, 1, 1, 1, 1, 1, 0, 1 },
      { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 1, 1, 1, 1, 0, 1, 1 },
      { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }
   };
   int pathLen = findShortestSafeRoute(mat);
   if(pathLen == -1)
      cout<<"No Safe Path from source to destination possible!";
   else
      cout<<"Shortest Safe route Length is "<<pathLen;
   return 0;
}

आउटपुट

Shortest Safe route Length is 10

  1. पता लगाएं कि रूट में एक जोड़ी पथ के साथ सी ++ में रूट के डेटा के बराबर योग है या नहीं

    इस समस्या में हमें एक Binary Tree दिया जाता है। और हमें यह पता लगाने की जरूरत है कि क्या रूट के डेटा के बराबर योग के साथ लीफ पाथ में रूट में कोई जोड़ा है। हमें यह जांचने की आवश्यकता है कि क्या नोड्स की एक जोड़ी मौजूद है जो रूट नोड से लीफ नोड्स के बीच स्थित है, ताकि जोड़े के मानों का योग रूट नोड क

  1. सी ++ में मैट्रिक्स में सुरक्षित सेल खोजें

    मान लीजिए कि हमारे पास एक मैट्रिक्स मैट है [] []। इसमें Z और P अक्षर हैं। Z ज़ोंबी है और P पौधा है। और एक अन्य पात्र * एक नंगी भूमि है। एक ज़ोंबी पौधे पर हमला कर सकता है, जब पौधा ज़ोंबी के निकट होता है। हमें ऐसे पौधों की संख्या का पता लगाना है, जो जॉम्बी से सुरक्षित हैं। मान लीजिए मैट्रिक्स नीचे जैस

  1. सी ++ में दिए गए बाधाओं के साथ मैट्रिक्स में सबसे लंबा पथ खोजें

    मान लीजिए कि हमारे पास ऑर्डर n का एक वर्ग मैट्रिक्स है। इसमें सभी विशिष्ट तत्व हैं। इसलिए हमें अधिकतम लंबाई पथ ज्ञात करना है, जैसे कि पथ के साथ सभी कोशिकाएं 1 के अंतर के साथ बढ़ते क्रम में हैं। एक सेल से हम चार दिशाओं में जा सकते हैं। बाएँ, दाएँ, ऊपर और नीचे। तो अगर मैट्रिक्स की तरह है - 1 2 9 5 3