走迷宫(bfs最短路

# 题意

n*m的迷宫其中每个节点为1代表是墙壁,不可通过,为0代表可通过求从起点(1,1)到终点(n,m)的最少移动次数

# 题解

pair存坐标,存距离因为bfs是以步长为1扩展所有出边,所以第一次到达终点的时候就是最少的移动次数

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e2+10;
 4 typedef pair<int,int>PII;
 5 queue<PII>q;
 6 int d[N][N],g[N][N];
 7 int n,m;
 8 int bfs(){
 9     d[0][0]=0;
10     q.push({0,0});
11     memset(d,0,sizeof d);
12     while(!q.empty()){
13         auto t=q.front();
14         q.pop();
15 
16         int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
17         for (int i = 0; i <4 ; ++i) {
18             int x=t.first+dx[i],y=t.second+dy[i];
19             if(x>=0 && x<n && y>=0 && y<m &&d[x][y]==0 && g[x][y]==0){
20                 q.push({x,y});
21                 d[x][y]=d[t.first][t.second]+1;
22             }
23         }}
24     return d[n-1][m-1];
25 }
26 int main(){
27     scanf("%d%d",&n,&m);
28     for (int i = 0; i < n; ++i)
29         for (int j = 0; j < m; ++j)
30             scanf("%d",&g[i][j]);
31     printf("%d",bfs());
32     return 0;
33 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12567595.html