BFS营救(save)

Posted hualian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS营救(save)相关的知识,希望对你有一定的参考价值。

描述

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

题目

 为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。

输入

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

输出

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

 输入样例 1

3
001
101
100
1 1 3 3 

输出样例 1

4

解题思路

  本题只需用广搜找最短路即可。

题解

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dir[4][2]=1,0,0,1,-1,0,0,-1;
 4 int x1,yy,x2,y2,n;
 5 int dz[1005][1005];
 6 struct node
 7     int x;
 8     int y;
 9     int t;
10 ;
11 void bfs(int x,int y)
12 
13     node p,t;
14     p.x=x;
15     p.y=y;
16     p.t=0;
17     queue<node> q;
18     for(q.push(p);!q.empty();q.pop())
19     
20         p=q.front();
21         if(p.x==x2&& p.y==y2)
22         
23             printf("%d\n",p.t);
24             break;
25         
26         for(int i=0;i<4;i++)
27         
28             t.x=p.x+dir[i][0];
29             t.y=p.y+dir[i][1];
30             if(t.x>0&&t.x<=n&&t.y>0&&t.y<=n&&!dz[t.x][t.y])
31             
32                 dz[t.x][t.y]=1;
33                 t.t=p.t+1;
34                 q.push(t);
35             
36         
37     
38 
39 int main()
40 
41     cin>>n;
42     for(int i=1;i<=n;i++)
43     
44         for(int j=1;j<=n;j++)
45             char c;
46             cin>>c;
47             dz[i][j]=c-0;
48             
49     
50     scanf("%d%d%d%d",&x1,&yy,&x2,&y2);
51     dz[x1][yy]=1;
52     if(x1==x2&&yy==y2)
53         cout<<0;
54     else
55         bfs(x1,yy);
56     return 0;
57 

 

以上是关于BFS营救(save)的主要内容,如果未能解决你的问题,请参考以下文章

hihocoder #1828 : Saving Tang Monk II(BFS)

hihocoder 1828 Saving Tang Monk II (DP+BFS)

HDU 5025 Saving Tang Monk 状态压缩BFS

ACM-ICPC2018北京网络赛 Saving Tang Monk II(bfs+优先队列)

2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II BFS

P1396营救+二分+BFS