营救
【问题描述】
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
【输入格式】
第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
【输出格式】
哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
【输入样例】save.in
3
001
101
100
1 1 3 3
【数据范围】
N<=1000
代码:
2、营救
【问题描述】
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
【输入格式】
第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
【输出格式】
哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
【输入样例】save.in
3
001
101
100
1 1 3 3
【数据范围】
N<=1000
样例输入:
In:
10
0100110100
0001110010
1000000001
1000100011
0000101100
1000001100
1001010011
0000010100
0101010000
1001000001
1 7 10 2
Out:14
In:
代码:
#include
using namespace std;
#include
int n,jz[1001][1001],xq,xz,yq,yz;
int xx[]={0,0,1,-1};
int yy[]={1,-1,0,0};
int dis[1001][1001];
int dl1[1001],dl2[1001];
void BFS();
int main()
{
scanf("%d",&n);
char p[1001];
for(int i=1;i<=n;++i)
{
scanf("%s",p+1);
for(int j=1;j<=n;++j)
{
if(p[j]=='0')
jz[i][j]=0;
if(p[j]=='1')
jz[i][j]=1;
}
}
scanf("%d%d%d%d",&xq,&yq,&xz,&yz);
BFS();
printf("%d\n",dis[xz][yz]);
return 0;
}
void BFS()
{
int head=0,tail=1;
dl1[tail]=xq;
dl2[tail]=yq;
dis[xq][yq]=0;
while(head
{
++head;
int x1=dl1[head],y1=dl2[head];
for(int i=0;i<4;++i)
{
int x2=x1+xx[i],y2=y1+yy[i];
if(x2>=1&&x2<=n&&y2>=1&&y2<=n&&!jz[x2][y2])
{
jz[x2][y2]=1;
++tail;
dis[x2][y2]=dis[x1][y1]+1;
dl1[tail]=x2;
dl2[tail]=y2;
}
if(dl1[tail]==xz&&dl2[tail]==yz)
{
head=tail;
break;
}
}
}
}