Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để tìm xem có đường dẫn giữa hai ô trong ma trận hay không

Trong bài viết này, chúng ta sẽ thảo luận về một chương trình để tìm xem liệu có tồn tại một đường dẫn giữa hai ô trong một ma trận nhất định hay không.

Giả sử chúng ta đã được cung cấp một ma trận vuông với các giá trị có thể là 0, 1, 2 và 3. Ở đây,

  • 0 nghĩa là Tường trống
  • 1 có nghĩa là Nguồn
  • 2 có nghĩa là Điểm đến
  • 3 có nghĩa là Ô trống

Chỉ có thể có một Nguồn và Đích trong ma trận. Chương trình là để xem liệu có một con đường khả thi nào từ Nguồn đến Đích trong ma trận đã cho di chuyển theo cả bốn hướng khả dĩ nhưng không theo đường chéo hay không.

Ví dụ

#include<bits/stdc++.h>
using namespace std;
//creating a possible graph from given array
class use_graph {
   int W;
   list <int> *adj;
   public :
   use_graph( int W ){
      this->W = W;
      adj = new list<int>[W];
   }
   void add_side( int source , int dest );
   bool search ( int source , int dest);
};
//function to add sides
void use_graph :: add_side ( int source , int dest ){
   adj[source].push_back(dest);
   adj[dest].push_back(source);
}
//function to perform BFS
bool use_graph :: search(int source, int dest) {
   if (source == dest)
      return true;
   // initializing elements
   bool *visited = new bool[W];
   for (int i = 0; i < W; i++)
      visited[i] = false;
      list<int> queue;
      //marking elements visited and removing them from queue
      visited[source] = true;
      queue.push_back(source);
      //moving to the adjacent vertices
      list<int>::iterator i;
      while (!queue.empty()){
         source = queue.front();
         queue.pop_front();
         for(i=adj[source].begin();i!=adj[source].end(); ++i) {
            if (*i == dest)
               return true;
            if (!visited[*i]) {
               visited[*i] = true;
               queue.push_back(*i);
            }
         }
      }
      //if destination is not reached
   return false;
}
bool is_okay(int i, int j, int M[][4]) {
   if ((i < 0 || i >= 4) || (j < 0 || j >= 4 ) || M[i][j] == 0)
      return false;
   return true;
}
bool find(int M[][4]) {
   int source , dest ;
   int W = 4*4+2;
   use_graph g(W);
   int k = 1 ;
   for (int i =0 ; i < 4 ; i++){
      for (int j = 0 ; j < 4; j++){
         if (M[i][j] != 0){
            if ( is_okay ( i , j+1 , M ) )
               g.add_side ( k , k+1 );
            if ( is_okay ( i , j-1 , M ) )
               g.add_side ( k , k-1 );
            if (j < 4-1 && is_okay ( i+1 , j , M ) )
               g.add_side ( k , k+4 );
            if ( i > 0 && is_okay ( i-1 , j , M ) )
               g.add_side ( k , k-4 );
      }
      if( M[i][j] == 1 )
         source = k ;
      if (M[i][j] == 2)
         dest = k;
         k++;
      }
   }
   return g.search (source, dest) ;
}
int main(){
   int M[4][4] = { { 0 , 3 , 0 , 1 }, { 3 , 0 , 3 , 3 }, { 2 , 3 , 0 , 3 },{ 0 , 0 , 3 , 0 }};
   (find(M) == true) ?
   cout << "Possible" : cout << "Not Possible" <<endl ;
   return 0;
}

Đầu ra

Not Possible