营救

来源:互联网 发布:python手机编译器 编辑:程序博客网 时间:2024/05/17 06:36

Problem Description

铁达尼号遇险了,他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
经过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1表明的是陆地,用0表明的是海洋。船只能从一个格子移到相邻的四个格子。为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离?

Input

输入有多组数据,每组数据第1行为n(n<=1000),下面是一个n*n的0、1矩阵,表示海洋地图
最后一行为四个小于n个整数,分别表示哥伦比亚号的铁达尼号的位置。

Output

对于每组数据匹配就输出哥伦比亚号到铁达尼号的最短距离,答案精确到整数。

Sample Input

30011011001 1 3 3

Sample Output

4
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[1010][1010],n,xx,yy,que[1000010][3],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};char b[1010];void search(int ,int );int main(){//freopen("a.txt","r",stdin);while(scanf("%d\n",&n)!=EOF){int i,j,x,y;memset(a,0,sizeof(a));memset(que,0,sizeof(que));for(i=1;i<=n;i++){gets(b);for(j=1;j<=n;j++)a[i][j]=b[j-1]-'0';}scanf("%d%d%d%d",&x,&y,&xx,&yy);if(x==xx&&y==yy) printf("0");else search(x,y);}return 0;}void search(int x,int y){int head=0,tail=1;que[1][0]=x; que[1][1]=y; que[1][2]=0; a[x][y]=1;while(head<tail){head++;for(int i=0;i<4;i++){x=que[head][0]+dx[i]; y=que[head][1]+dy[i];if(!a[x][y]&&x>0&&x<=n&&y>0&&y<=n){tail++;que[tail][0]=x;que[tail][1]=y;a[x][y]=que[tail][2]=que[head][2]+1;if(a[xx][yy]>0){printf("%d\n",a[xx][yy]);return;}}}}}


0 0