题目描述
话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送 装置,我们终于确定了他的位置,必须赶快到那里去救他。
根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到Mike博士,于是这个光荣和艰巨的任务便交给了你,编写程序,通过使用一张地图帮助研究所确定从研究所出发找到 Mike博士最短距离。
数据范围: n<=1000
输入格式
第一行为n
第二行为n*n的地图(其中0表示通路,1表示死路)
最后两行每行有两个数字,分别表示研究所的坐标和博士信号所在的位置。
输出格式
一个数字k,表示从研究所出发找到Milk博士的最短距离。
Sample Input
10
0100110100
0001110010
1000000001
1000100011
0000101100
1000001100
1001010011
0000010100
0101010000
1001000001
1 7
10 2
Sample Output
14
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <ctime>
#define mxn 1000+10
#define loc
using namespace std;
const int mx[4]={0,1,0,-1};
const int my[4]={1,0,-1,0};
int n;
int mp[mxn][mxn];
bool v[mxn][mxn];
int xs,ys,xt,yt;
struct Nd
{
int x,y;
int stp;
}q[mxn*100000];
char s[mxn];
int l,r;
bool ck(int x,int y)
{
if (x>=1&&x<=n&&y>=1&&y<=n&&!v[x][y]&&!mp[x][y]) return 1;
return 0;
}
void bfs()
{
memset(q,0,sizeof(q));
l=r=1;
q[l].x=xs,q[l].y=ys,v[xs][ys]=true,q[l].stp=1;
while (l<=r)
{
for (int i=0;i<4;++i)
{
int X=q[l].x+mx[i],Y=q[l].y+my[i];
if (X==xt&&Y==yt)
{
printf("%d",q[l].stp);
exit(0);
}
if (ck(X,Y))
{
v[X][Y]=true;
q[++r].x=X,q[r].y=Y;
q[r].stp=q[l].stp+1;
}
}
l++;
}
}
int main()
{
#ifdef loc
freopen("rescue.in","r",stdin);
freopen("rescue.out","w",stdout);
#endif
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
scanf("%s",s);
for (int j=0;j<n;++j)
{
if (s[j]=='0') mp[i][j+1]=0;
else mp[i][j+1]=1;
}
}
scanf("%d%d%d%d",&xs,&ys,&xt,&yt);
bfs();
return 0;
}