题目描述
羊羊们选出的代表不负重望,击败了骄傲的Jack。Jack恼羞成怒,违反了原则要抓小羊,情况紧急,羊羊们必须找到一条最短的路径逃出Jack的城堡。
Jack的城堡是一个n*m的矩形,里面有一些地方可以通过(用0表示),有一些地方则为墙或障碍物(用1表示),无法通过,小羊们处于(x,y)处,出口在(n,m)处。可小羊们无法立刻求到这条路径,这时,善良而伟大的Yyz出现了,他给了羊羊们城堡的地图和一台笔记本电脑。羊羊们要通过这来求出到出口的最短路径。
输入
第1行,两个正整数n,m(n,m≤500),表示城堡的长和宽。
第2~n+1行,每行n个数字(0和1),表示此处城堡地形。
第n+2行,两个正整数x,y(x,y均不超过n,m),表示小羊所处位置。输出
一行,一个数,表示最短路径的长度。
样例输入 Copy
6 5 0 0 1 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 2 2样例输出 Copy
7
代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int n,m,x,y;
int a[510][510],d[510][510];
bool st[510][510];
int nx[]={1,0,-1,0},ny[]={0,1,0,-1};
void bfs()
{
queue<PII> q;
int k,l;
q.push({x,y});
d[x][y]=0;
st[x][y]=true;
while(q.size())
{
auto t=q.front();
q.pop();
int x1=t.first,y1=t.second;
for(int i=0;i<4;i++)
{
k=x1+nx[i],l=y1+ny[i];
if(k>=1&&l>=1&&k<=n&&l<=m&&!st[k][l]&&!a[k][l])
{
q.push({k,l});
d[k][l]=d[x1][y1]+1;
st[k][l]=true;
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
cin>>x>>y;
bfs();
cout<<d[n][m];
return 0;
}