ACWING 844.走迷宮
阿新 • • 發佈:2020-04-12
地址:https://www.acwing.com/problem/content/846/
走迷宮,從左上角走到右下角,0可走,1不可走,問最少需要幾步。
BFS解法: 通過g[][]記錄地圖,d[][]初始化為-1用來保證一個點只能走一次以及記錄每個點到達終點的距離。
注意:使用以下語句來實現佇列記錄(x,y);
#include<queue> typedef pair<int,int>pp; queue<int>q; q.push({1,2}); pp t=q.front; 那麼:t.first=1,t.second=2
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; typedef pair<int,int>P; //!!! const int maxn = 105; int n,m; int g[maxn][maxn]; int d[maxn][maxn]; //每個點到起點的距離 //沒有走過 int dx[]={0,0,-1,1}; int dy[]={1,0}; int bfs() { queue<P>q; memset(d,-1,sizeof(d)); d[0][0]=0; q.push({0,0}); while(!q.empty()) { P t = q.front(); q.pop(); for(int i=0;i<4;i++) { int x=dx[i]+t.first; int y=dy[i]+t.second; if(x>=0&&y>=0&&x<n&&y<m&&g[x][y]==0&&d[x][y]==-1) { d[x][y]=d[t.first][t.second]+1; q.push({x,y}); } } } return d[n-1][m-1]; } int main() { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>g[i][j]; cout<<bfs()<<endl; return 0; }