Fire! (两点BFS)

本文介绍了一个基于广度优先搜索的算法来解决火灾中人物如何从一个n*m的网格中找到最快逃生路径的问题。该算法首先标记所有火源蔓延可达的位置及时间,接着使用广度优先搜索来确定人物能够到达的安全位置,最终找到最短逃生时间。

题目链接:https://cn.vjudge.net/problem/28833/origin

 

题目大意:

给1个n*m的网格,上面有的点能走,有的点不能走(墙),然后有的点是火源,火源和人一样,每次都是上下左右四个方向蔓延,速度一样是1,火也不可以从墙上跨过去,给你人的起点,终点是只要走到边界就行,就是走出矩阵,问你最小逃生时间。

 

思路:

先处理火源,把每个点最早到达的火源的时间记录下来,用所有的火源把地图处理完了之后再跑广搜

 

 1 #include<cstring>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 const int maxn=1050;
 8 const int inf=0x3f3f3f3f;
 9 struct node{
10     int x,y,t;
11     node(int X,int Y,int T)
12     {
13         x=X,y=Y,t=T;
14     }
15 };
16 queue<node> q;
17 int t,n,m,p[maxn][maxn],vis[maxn][maxn],sx,sy;
18 int dx[]={0,0,1,-1};
19 int dy[]={1,-1,0,0};
20 char a[maxn][maxn];
21 void init_bfs()
22 {
23     while(!q.empty())
24     {
25         node u=q.front();q.pop();
26         for(int i=0;i<4;i++)
27         {
28             int vx=u.x+dx[i],vy=u.y+dy[i];
29             if((vx>=1&&vx<=n&&vy>=1&&vy<=m)&&a[vx][vy]!='#'&&p[vx][vy]==inf)
30             {
31                 q.push(node(vx,vy,0));
32                 p[vx][vy]=p[u.x][u.y]+1;
33             }
34         }
35     }
36 }
37 void bfs()
38 {
39     while(!q.empty()) q.pop();
40     q.push(node(sx,sy,0));
41     vis[sx][sy]=1;
42     while(!q.empty())
43     {
44         node u=q.front();q.pop();
45         if(u.x==n||u.x==1||u.y==1||u.y==m)
46         {
47             printf("%d\n",u.t+1);
48             return;
49         }
50         for(int i=0;i<4;i++)
51         {
52             int vx=u.x+dx[i],vy=u.y+dy[i];
53             if((vx>=1&&vx<=n&&vy>=1&&vy<=m)&&a[vx][vy]!='#'&&!vis[vx][vy]&&(u.t+1<p[vx][vy]))
54             {
55                 q.push(node(vx,vy,u.t+1));
56                 vis[vx][vy]=1;
57             }
58         }
59     }
60     puts("IMPOSSIBLE");
61     return;
62 }
63 int main()
64 {
65     scanf("%d",&t);
66     while(t--)
67     {
68         while(!q.empty()) q.pop();
69         memset(vis,0,sizeof(vis));
70         memset(p,inf,sizeof(p));
71         scanf("%d%d",&n,&m);
72         for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
73         for(int i=1;i<=n;i++)
74             for(int j=1;j<=m;j++)
75             {
76                 if(a[i][j]=='J') sx=i,sy=j;
77                 if(a[i][j]=='F')
78                 {
79                     q.push(node(i,j,0));
80                     p[i][j]=0;
81                 }
82             }
83             init_bfs();
84             bfs();
85     }
86     return 0;
87 } 

 

转载于:https://www.cnblogs.com/-Ackerman/p/11197653.html

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
题目描述 已知有座楼房并排位于街道一侧,其中有座发生了火灾,第一单位时间内仅在火灾起始点所在的楼房开始燃烧,接下来每经过一个单位时间,一座楼房的火灾就会蔓延到左右两座楼房,假设每座楼房的火势不会自动熄灭,请问多久火灾会蔓延到每一栋楼房。 输入 输入共两行。 第1行包含两个整数:N、M,之间用一个空格分隔,代表一共有N座楼房,有M座发生了火灾; 第2行包含M个整数k_i,其中1<=k_i<=N;1<=i<=M,各数之间用一个空格分隔,代表第i座楼房发生火灾。 注意:这里i从1开始计数,即座楼房中最左边的楼房记为第1座楼房。 输出 输出一个整数,代表火势蔓延到每一栋楼时所需的时间。 输入样例1 5 1 3 输出样例1 3 输入样例2 3 3 3 1 2 输出样例2 1 输入样例3 6 2 1 2 输出样例3 5 样例解释 样例1中一共有5座楼房,其中第3座楼房发生了火灾。第3座的火灾开始烧一分钟后,会向左向右各蔓延一次,即,然后再蔓延一次,即,共经过两次蔓延,即1+2=3分钟后,火灾进入每一座楼房。 样例3中一共有6座楼房,其中有2座楼房即第1座、第2座楼房发生了火灾。第2座楼房开始烧一分钟后,会向左向右各蔓延一次,即;然后再向右蔓延一次,即;继续向右蔓延两次:4分钟后,火灾进入每一座楼房。 Hint 1.对于80%的数据,1<=N<=10^4;对于20%的数据,10^42.基础的模拟方法: 使用一个一维列表lis来模拟这排楼房的状态,设定初始着火的楼房状态为0,未着火的楼房状态为1。遍历列表,更新着火楼房两侧楼房的状态,注意这里的更新是同时的,所以需要一个新列表来存储新的状态,而不能直接在原列表上修改。当最左侧的楼房或最右侧的楼房着火时,需要考虑边界条件上的情况。 3.请尝试除了模拟以外其他的方法来解决这个问题,直接采用模拟可能会出现TLE。 可以先对着火的楼房按照位置排序,确保列表中相邻两个元素的差值最小,再遍历排序后发生火灾的楼房,计算着火的每两座楼房之间距离的最大值,不难得出结论:火势蔓延到所有楼房的时间,与火势完全覆盖距离最大的两座楼房之间所有楼房的时间是相同的。注意考虑发生火灾的楼房中第一个最后一个边界条件。例如,左(右)边第一个着火的楼房最右侧之间楼房的个数也应纳入计算中。
10-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值