AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 110;
typedef pair<int,int>PII;
int n,m,mp[N][N];
queue<PII>q;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int dist[N][N];
int bfs()
{
q.push({1,1});
dist[1][1]=0;
while(!q.empty())
{
auto hh=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int a=hh.first+dx[i];
int b=hh.second+dy[i];
if(a<1||b<1||a>n||b>m)continue;
if(dist[a][b]!=-1)continue;
if(mp[a][b]!=0)continue;
dist[a][b]=dist[hh.first][hh.second]+1;
q.push({a,b});
}
}
return dist[n][m];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
}
}
memset(dist,-1,sizeof dist);
cout<<bfs();
return 0;
}
相关解释:
这题为BFS入门题,这题值得注意的是,如果你将return mp[m][n];放在while循环里面的话,那么这就不会ac,因为如果你将它放进里面,那么如果测试数据是:
1 1
0
那么它将不会通过,因为a和b两者其中一个一定要大于1,所以终点是1,1的话,他在输出错误答案。所以正确的做法应该是将return语句放到while循环外面。
这相当于模板代码,最好这样写,不然很容易出错。