কম্পিউটার

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. সি++ এ রুটের ডেটার সমতুল্য সমষ্টি সহ একটি পাতার পথের রুটে একটি জোড়া আছে কিনা তা খুঁজুন

  2. C++ এ বাইনারি ম্যাট্রিক্সের সবচেয়ে ছোট পথ

  3. C++ এ একটি ম্যাট্রিক্সে নিরাপদ কোষ খুঁজুন

  4. C++ এ প্রদত্ত সীমাবদ্ধতা সহ একটি ম্যাট্রিক্সে দীর্ঘতম পথ খুঁজুন