C ++程序查找矩阵中两个单元之间是否存在路径

在本文中,我们将讨论一个程序,以查找给定矩阵中两个单元之间是否存在路径。

让我们假设我们得到了一个可能值为0、1、2和3的方阵。

  • 0表示空白墙

  • 1表示来源

  • 2表示目的地

  • 3表示空白单元格

矩阵中只能有一个“源”和“目标”。该程序将查看给定矩阵中是否存在从源到目标的可能路径,该路径在所有四个可能的方向上移动,而不是沿对角线移动。

示例

#include<bits/stdc++.h>

using namespace std;

//从给定数组创建可能的图形

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);

};

//添加边的功能

void use_graph :: add_side ( int source , int dest ){

   adj[source].push_back(dest);

   adj[dest].push_back(source);

}

//执行BFS的功能

bool use_graph :: search(int source, int dest) {

   if (source == dest)

      return true;

   //初始化元素

   bool *visited = new bool[W];

   for (int i = 0; i < W; i++)

      visited[i] = false;

      list<int> queue;

      //标记访问过的元素并将其从队列中删除

      visited[source] = true;

      queue.push_back(source);

      //移动到相邻的顶点

      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);

            }

         }

      }

      //如果没有到达目的地

   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;

}

输出结果

Not Possible

以上是 C ++程序查找矩阵中两个单元之间是否存在路径 的全部内容, 来源链接: utcz.com/z/327010.html

回到顶部