ในบทความนี้ เราจะพูดถึงโปรแกรมเพื่อค้นหาว่ามีเส้นทางระหว่างสองเซลล์ในเมทริกซ์ที่กำหนดหรือไม่
สมมติว่าเราได้รับเมทริกซ์สี่เหลี่ยมจัตุรัสที่มีค่าที่เป็นไปได้ 0, 1, 2 และ 3 ที่นี่
- 0 หมายถึง กำแพงว่างเปล่า
- 1 หมายถึง แหล่งที่มา
- 2 หมายถึง ปลายทาง
- 3 หมายถึง เซลล์ว่าง
ในเมทริกซ์สามารถมีต้นทางและปลายทางได้เพียงแห่งเดียวเท่านั้น โปรแกรมคือดูว่ามีเส้นทางที่เป็นไปได้จากต้นทางไปยังปลายทางในเมทริกซ์ที่กำหนดหรือไม่ซึ่งเคลื่อนที่ไปในทั้งสี่ทิศทางที่เป็นไปได้ แต่ไม่ใช่ในแนวทแยง
ตัวอย่าง
#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