E - Fire! (双向bfs)

news2024/11/27 2:23:20

UVA-11624-Fire!

 

题意:在n*m的网格内,有一个人和n堆火,人可以往上下左右四个方向走,同时所有的火也会想四周蔓延,问你人可不可以在火包围他之前逃离这个n*m的范围。

思路:问人可不可以逃离这个范围,就是看人能不能走到最外面的一圈的格子。但是人在走的时候火也会走,那么我们就要进行人 和火的同时的bfs,人和火同时bfs同时更新状态,首先对于人,人先往四周bfs,但是问题来了,我们怎么判断什么时候这一轮人的bfs应该停止去进行火的bfs——————我们可以在每次bfs之前去记录队列中包含的元素,只要对队列的元素进行 bfs就可以停止了,之后对火的bfs就可以了。但是有个问题需要注意一下,就是当人的bfs之后,火可能会把人能走的位置直接封住,但是人的可能的情况已经进入队列了,我们再删除也不好处理,那么我们可以逆向思维先bfs火的范围的,因为火如果先走的话那么人直接走能走的点就可以了

那么最后的整体的框架就是:

先bfs火能走的范围

然后bfs人能走的范围

每次bfs的次数是bfs之前队列的元素的个数

注意最后到达最外圈的结果应该要+1才能出去

最后我bfs的标记写错了,我的每次标记时是在出队的时候再标记

但是正确的标记应该是在入队的时候就去标记,因为如果是在出队时才标记,那么可能会标记很多重复的元素导致t(比如我入队了{1,2,3}三个元素,然后到1这个元素的时候也可能会入队{2,3}这两个元素,而先标记1 2 3三个元素在之后就不会出现重复入队的情况),当时就卡了这个点qwq!!!

代码

/**
 *  ┏┓   ┏┓+ +
 * ┏┛┻━━━┛┻┓ + +
 * ┃       ┃
 * ┃   ━   ┃ ++ + + +
 *  ████━████+
 *  ◥██◤ ◥██◤ +
 * ┃   ┻   ┃
 * ┃       ┃ + +
 * ┗━┓   ┏━┛
 *   ┃   ┃ + + + +Code is far away from  
 *   ┃   ┃ + bug with the animal protecting
 *   ┃    ┗━━━┓ 神兽保佑,代码无bug 
 *   ┃  	    ┣┓
 *    ┃        ┏┛
 *     ┗┓┓┏━┳┓┏┛ + + + +
 *    ┃┫┫ ┃┫┫
 *    ┗┻┛ ┗┻┛+ + + +
 */

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;

const int N = 1000000 + 100;
int n, m, h;
ll s[N];
char Map[1010][1010];

struct lk
{
	int x;
	int y;
	int cnt;
};
queue<lk> q, p;
int dirx[5] = {0, 1, 0, -1, 0};
int diry[5] = {0, 0, -1, 0, 1};
bool st[1010][1010];
bool stf[1010][1010];

void bfs(int a, int b)
{

	q.push({a, b, 0});
	st[a][b] = 1;
	int sum=0;
	while (q.size() )
	{
		while (p.size())
		{

			lk kk = p.front();
				if (kk.cnt > sum)
				break;
			p.pop();
	
			// cout<<kk.x<<"huo"<<kk.y<<endl;
			for (int i = 1; i <= 4; i++)
			{
				int xx = kk.x + dirx[i], yy = kk.y + diry[i];
	
				if (xx < 1 || xx > n || yy < 1 || yy > m)
					continue;
				if ( Map[xx][yy] != '.')
					continue;
					// cout<<xx<<" "<<yy<<endl;
				Map[xx][yy]='F';
				p.push({xx, yy, kk.cnt + 1});
			}
		}

		while (q.size())
		{
			lk k = q.front();
			if(k.cnt>sum)break;
			q.pop();

			// cout<<k.x<<" ren "<<k.y<<endl;
			if (k.x == 1 || k.x == n || k.y == 1 || k.y == m)
			{
				cout << k.cnt+1 << endl;
				return;
			}			


			for (int i = 1; i <= 4; i++)
			{
				int xx = k.x + dirx[i], yy = k.y + diry[i];
				if (xx < 1 || xx > n || yy < 1 || yy > m)
					continue;
				if (st[xx][yy] || Map[xx][yy] == '#'||Map[xx][yy]=='F')
					continue;
				st[xx][yy] = 1;					
				q.push({xx, yy, k.cnt + 1});
			}
		}

		sum++;
	}

	cout << "IMPOSSIBLE\n";
	return;
}

int main()
{
	int t;
	sc_int(t);
	while (t--)
	{	
		memset(st,0,sizeof st);

		while(q.size())q.pop();
		while(p.size())p.pop();
		int x, y;
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
			cin >> Map[i] + 1;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				if (Map[i][j] == 'F')
				{
					p.push({i, j, 0});
					stf[i][j] = 1;
				}
				if (Map[i][j] == 'J')
				{
					x = i;
					y = j;
				}
			}
		}
		bfs(x, y);
	}

	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m基于VDLL的矢量型GPS信号跟踪算法matlab仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 载波跟踪环是传统独立式GPS接收机最脆弱的环节&#xff0c;针对弱信号环境下其比伪码跟踪环路更容易失锁的问题&#xff0c;给出一种基于矢量频率锁定环&#xff08;vector-frequency lo…

集成学习-Boosting

Boosting 采用串行的方式训练&#xff0c;各基分类器之间有依赖。根据当前模型损失函数的负梯度训练新的弱分类器&#xff0c;将训练好的弱分类器以累加的形式结合到现有模型中。 过程中会不断减小损失函数&#xff0c;使模型偏差不断降低&#xff0c;方差不会降低。因为各弱分…

《CTFshow - Web入门》02. Web 11~20

Web 11~20web11知识点题解web12知识点题解web13知识点题解web14知识点题解web15知识点题解web16知识点题解web17知识点题解web18知识点题解web19知识点题解web20知识点题解web11 知识点 dns检查查询&#xff1a;http://dbcha.com/&#xff0c;输入域名&#xff0c;获取flag。…

MySQL数据库期末考试试题及参考答案(07)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 如果不想提交当前事务&#xff0c;可以使用_____语句回滚事务。每个事务都是完整不可分割的最小单元是事务的_____性。MySQL中&#xff0c;显式开启事务的语句…

屏幕视频捕获组件-ByteScout Screen Capturing SDK

使用 ByteScout Screen Capturing SDK&#xff0c;您可以轻松地将屏幕视频捕获功能添加到您的应用程序中。输出带有音频、鼠标移动和点击的高质量桌面屏幕视频录制。 主要优势 只需几行代码即可在您的应用中启用屏幕视频捕获和屏幕录制功能&#xff1b;无需互联网连接即可离线…

Django day1

在windows下可以直接的创建django项目 但是需要把自动生成的templates和setting里面的DIRS里面字段删除&#xff08;templates自动生成的可以删不删都行&#xff0c;我是看视频那个老师删了&#xff0c;但是setting DIRS里面的字段需要删&#xff0c;至于具体为啥我已经忘了&am…

TiDB数据库概述——PD

PD PD的架构与功能TSO的分配PD的调度原理label的作用 PD的架构 PD的个数一般是奇数个的。 PD的主要功能&#xff1a; 整个集群TiKV的元数据存储分配全局ID和事务ID生成全局时间戳TSO收集群信息进行调度提供label&#xff0c;支持高可用提供TiDB Dashboard 路由功能 用key…

vue3使用富文本编辑器wangEditor-v5(未使用composition api写法)

效果 安装 安装核心库和其vue组件库 yarn add wangeditor/editor yarn add wangeditor/editor-for-vuenext使用v-model封装富文本组件editor.vue <template><div class"editor-box"><Toolbar class"toolbar" :editor"editor" …

Flink是什么?场景?处理流的发展演变?

Flink是什么&#xff1f;Flink是什么&#xff1f;为什么选择Flink&#xff1f;什么场景需要处理流数据?处理流的发展演变Flink是什么&#xff1f; Apache Flink 是一个在无界和有界数据流上进行状态计算的框架和分布式处理引擎。Flink 能在所有常见集群环境中运行&#xff0c…

线性表的链式存储的基本

链表是线性表的链式存储方式&#xff0c;逻辑上相邻的数据在计算机内的存储位置不一定相邻&#xff0c;因此&#xff0c;我们需要为每一个元素设置有一个指针来指向与它逻辑相邻的元素。 为此&#xff0c;我们为每个元素设置一个结点&#xff0c;每个结点由数据域和指针域组成…

【3D目标检测】Monocular 3D Object Detection with Pseudo-LiDAR Point Cloud

目录概述整体流程伪点云vs点云2D-3D边界框的一致性约束概述 本文的输入数据仅仅是单目图像&#xff0c;在方法上是融合了伪点云&#xff08;Pseudo-LiDAR&#xff09;的深度信息表示方法与Frustum PointNets的检测方法。 乍一看文章和伪点云原论文Pseudo-LiDAR from Visual De…

Deep-SVDD 方法

两种情况 1. 数据集有正负样本&#xff0c;但正样本的量远远大于负样本为异常检测&#xff0c;即大量的正样本为正常&#xff0c;少数的负样本是异常的。 2. 数据集只有正样本&#xff0c;称为单分类&#xff0c;即只通过正样本训练模型&#xff0c;区分正样本和非正样本。 情…

蓝桥杯2021年第十二届省赛真题-时间显示(C and C++)

这一篇是个小记&#xff0c;真无语了&#xff0c;看见这个题感觉哇塞好简单的感觉&#xff0c;谁知道栽了&#xff0c;烦死了 话不多说&#xff0c;记录一下 C语言 #include<stdio.h> int main() {int a,b,c;long long time;//题上说了10的18次方的正整数&#xff0c;所…

Spring:AOP的五种通知类型(12)

AOP的五种通知类型前置通知&#xff1a;Before注解后置通知&#xff1a;After注解环绕通知&#xff1a;Around注解&#xff08;掌握&#xff09;返回后通知&#xff1a;AfterReturning&#xff08;了解&#xff09;异常后通知&#xff1a;AfterThrowing&#xff08;了解&#x…

直播回顾 | 【原引擎】解密云原生安全:如何应对新型BOT攻击?

BOT流量是指在互联网上对Web网站、APP应用、API接口通过工具脚本、爬虫程序或模拟器等非人工手动操作访问的自动化程序流量&#xff0c;一般也称为机器人流量。而恶意的BOT流量通过利用代理或秒拨IP、手机群控等手段来爬取信息数据、抢刷接口、薅羊毛、外挂作弊等恶意攻击行为&…

招标 | 近期隐私计算项目招标中标25(大连理工大学、中国电信北京研究院、松山湖材料实验室、北京控制工程研究所、光大永明)

开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 177篇原创内容 …

apache-POI ,easyexcel(3个办公软件)

POI介绍 ApachePOI是用Java编写的免费开源的跨平台的JavaAPI&#xff0c;ApachePOI提供API给Java程序对MicrosoftOffice格式档案读和写的功能&#xff0c;其中使用最多的就是使用POI操作Excel文件。 HSSF&#xff0d;提供读写MicrosoftExcelXLS格式档案的功能XSSF&#xff0d;…

【设计模式】适配器模式

适配器模式属于结构型模式&#xff0c;主要解决两个已存在的功能相近的接口间不能兼容的问题。在准备将一个接口对接到另一个接口中时&#xff0c;发现另一个接口&#xff08;目标&#xff09;与准备对接的接口&#xff08;适配者&#xff09;因不兼容而无法正常运行功能时&…

Allegro如何打盲埋孔操作指导

Allegro如何打盲埋孔操作指导 Allegro支持打盲埋孔,具操作如下 首先保证库路径下方有盲埋孔的封装 打开规则管理器 选择Physical规则,点击VIAS,会出现一个对话框,勾选show vias from Library ,出现孔的封装 把孔添加到via list里面去,之后点击ok 加好的效果如

web前端-javascript-数据类型(6种数据类型/字符串、数值、布尔值、空值、未定义、对象,String字符串、引号问题、转义字符、字面量和变量输出)

文章目录数据类型1. 介绍说明2. String 字符串引号问题转义字符字面量和变量的输出数据类型 var str "hello"; str 我说:"今天天气真不错&#xff01;";str 我说:"今天\t天气真不错&#xff01;"; str "\\\\\\";//输出字面量str …