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 }