B:营救铁达尼号

Problem B: 营救铁达尼号

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 204  Solved: 54
[Submit][Status][Web Board]

Description

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

Input

第一行为n,下面是一个n*n的0,1矩阵,表示海洋地图
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。

Output

哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。

Sample Input

3
001
101
100
1 1 3 3

Sample Output

4

HINT

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,a,b,c,d,pic[1001][1001],h[1000001][2];
 4 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
 5 char amap[1001][1001];
 6 void bfs(int x1,int y1,int x2,int y2)
 7 {
 8     int head,tail,x,y;
 9     pic[x1][y1]=1;
10     head=1;
11     tail=1;
12     h[1][0]=x1;
13     h[1][1]=y1;
14     while(head<=tail)
15     {
16         for (int i=0;i<=3;i++)
17         {
18             x=h[head][0]+dx[i];
19             y=h[head][1]+dy[i];
20             if (x>=1 && x<=n && y>=1 &&y<=n && pic[x][y]==0)
21             {
22                 tail++;
23                 h[tail][0]=x;
24                 h[tail][1]=y;
25                 pic[x][y]=pic[h[head][0]][h[head][1]]+1;
26                 if (x==x2 && y==y2)
27                 break;
28             }
29         }
30         head++;
31     }
32 }
33 int main()
34 {
35     cin>>n;
36     for (int i=1;i<=n;i++) 
37     for (int j=1;j<=n;j++)
38     {
39         cin>>amap[i][j];
40         pic[i][j]=amap[i][j]-48;
41     }
42     cin>>a>>b>>c>>d;
43     bfs(a,b,c,d);
44     cout<<pic[c][d]-1<<endl;
45     return 0;
46 } 
save

 

posted @ 2017-04-29 18:02  LHR-LHR  阅读(389)  评论(0编辑  收藏  举报