C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

マトリックス内の2つのセル間にパスがあるかどうかを確認するC++プログラム


この記事では、特定のマトリックス内の2つのセル間にパスが存在するかどうかを確認するプログラムについて説明します。

可能な値が0、1、2、3の正方行列が与えられたとしましょう。ここでは

  • 0は空白の壁を意味します
  • 1はソースを意味します
  • 2は目的地を意味します
  • 3は空白セルを意味します

マトリックスには、送信元と宛先を1つだけ含めることができます。プログラムは、指定されたマトリックス内に、斜めではなく4つの可能なすべての方向に移動する、送信元から宛先への可能なパスがあるかどうかを確認することです。

#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;
}

出力

Not Possible

  1. C++プログラムで二分木の2つのノード間の距離を見つける

    この問題では、二分木と2つのノードが与えられます。私たちの仕事は、二分木の2つのノード間の距離を見つけるプログラムを作成することです。 問題の説明 2つのノード間の距離を見つける必要があります。これは、あるノードから別のノードに移動するときに通過するエッジの最小数です。 問題を理解するために例を見てみましょう 入力 :二分木 Node1 =3、Node2 =5 出力 :3 説明 5です。距離3を作る3つのエッジが通過します。 ソリューションアプローチ この問題の簡単な解決策は、特定のノードに最も低い共通の祖先ノードを使用してから、次の式を適用することです。 dista

  2. グラフ行列の逆行列を見つけるためのC++プログラム

    これは、グラフ行列の逆行列を見つけるためのC++プログラムです。行列の逆行列は、行列が非特異である場合にのみ存在します。つまり、行列式は0であってはなりません。行列の逆行列は多くの方法で見つけることができます。ここでは、随伴行列とその行列式を使用して、グラフ行列の逆行列を見つけます。例に含まれる手順 Begin    function INV() to get the inverse of the matrix:    Call function DET().    Call function ADJ().