4223. 点火游戏

news/2024/11/17 14:46:36/

给定一个 N行 M 列的方格矩阵。

其中一部分方格是草地,其余部分是空地。

草地能够被燃烧,空地不会。

当某个草地在 t 时刻被点燃时,其上下左右四个方向的相邻方格中的草地方格也会在 t+1 时刻被点燃。

注意,空地方格无论如何都不可能被点燃。

现在,你可以选择最多两个草地,将它们点燃。

请你计算,使得所有草地都被点燃所需花费的最少时间。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含两个整数 N,M。

接下来 N 行,包含一个 N×M 的字符矩阵,# 表示草地,. 表示空地。

输出格式

每组数据输出一个结果,每个结果占一行。

结果表示为 Case x: y,其中 x 为组别编号(从 1 开始),y 点燃所有草地需要花费的最短时间。如果无法点燃所有草地或者所有方格都是空地则输出 −1。

数据范围

1≤T≤100,
1≤N,M≤10。

输入样例:

5
3 3
.#.
###
.#.
3 3
.#.
#.#
.#.
3 3
...
#.#
...
3 3
###
..#
#.#
3 3
...
...
...

输出样例:

Case 1: 1
Case 2: -1
Case 3: 0
Case 4: 2
Case 5: -1

 

简单的bfs,就是细节比较多 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <stack>
using namespace std;
//#define int long long
typedef pair<int,int>PII;
constexpr int N=10000;
int n,m;
vector<PII>p;
char s[12][12];
int st[12][12];
int res[12][12];
int g[12][12];
int ans=-1;
int dx[4]={1,0,0,-1},dy[4]={0,1,-1,0};
void bfs(int t1,int t2,int t3,int t4){ans=0;queue<PII>q;q.push({t1,t2});q.push({t3,t4});res[t1][t2]=0,res[t3][t4]=0;while(q.size()){auto t=q.front();//cout<<t.first<<" "<<t.second<<endl;q.pop();for(int i=0;i<4;i++){int x=t.first+dx[i],y=t.second+dy[i];if(x>=1&&x<=n&&y>=1&&y<=m&&!st[x][y]&&s[x][y]=='#'){q.push({x,y});st[x][y]=1;res[x][y]=res[t.first][t.second]+1;ans= max(ans,res[x][y]);}}}
}
signed main()
{ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);int t;cin>>t;int k=0;while(t--) {p.clear();memset(g,0, sizeof g);cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> s[i][j];if (s[i][j] == '#') {p.push_back({i, j});g[i][j] = 1;}}}if (p.empty()) cout <<"Case "<< ++k << ": " << -1 << endl;else if(p.size()==1) cout <<"Case "<< ++k << ": " << 0 << endl;else {int ww=1e7,tp=0;for (int i = 0; i < p.size(); i++) {for (int j = i + 1; j < p.size(); j++) {tp=0;memset(st,0, sizeof st);memset(res,0, sizeof res);st[p[i].first][p[i].second] = 1;st[p[j].first][p[j].second] = 1;//st[1][3] = 1;//st[3][1] = 1;//cout<<"........"<<endl;bfs(p[i].first, p[i].second, p[j].first, p[j].second);//bfs(1, 3, 3, 1);for(int q1=1;q1<=n;q1++){for(int q2=1;q2<=m;q2++){if(st[q1][q2]!=g[q1][q2]) tp=1;}}if(!tp) ww= min(ww,ans);//cout<<tp<<endl;//cout<<ans<<endl;//cout<<"........"<<endl;}}if(ww!=1e7)cout <<"Case "<< ++k << ": " <<ww<< endl;else cout <<"Case "<< ++k << ": " <<-1<< endl;}}return 0;
}

 


http://www.ppmy.cn/news/797706.html

相关文章

altronic点火模块维修点火盒维修791010-6

altronic点火模块维修点火盒维修791010-6 ALTRONIC点火线盒维修点火系统模块控制器维修北京 altronic发电机组点火模块维修CD1 点火盒维修胜动700机791010-6 Altronic发电机8缸机点火系统电路板维修 根据故障报警和工作表现初步判断故障的类型和哪些硬件出了问题&#xff0…

汽车电子常见脉冲实验简介

一个汽车电子模块制作出来后&#xff0c;需要通过实验验证&#xff0c;才能基本保证在实车上运行正常。这些实验主要是模拟实车各种工况下的异常电压。 ISO 7637-2 2011和ISO 16750-2 2010定义了常见的脉冲&#xff0c;前者定义了脉冲1、脉冲2a、2b、脉冲3a、3b&#xff1b;后者…

STM32的单脉冲

的 可以设置成 &#xff08;OPM&#xff09;。所谓的单脉冲就是通过程序在一定可控延时后&#xff0c;产生一个脉宽可控的脉冲。这里的延时时间与脉冲宽度都可以设置&#xff0c;主要通过比较&#xff1a;定时器的计数值TIM_CNT、定时器的比较值TIM_CCRx与定时器的周期值TIM_AR…

微型计算机点火系统有分电器,汽油机点火系统!

概 述 一、功用: 将汽车电源供给的低压电转变为高压电&#xff0c;并按发动机的作功顺序和点火时间要求&#xff0c;配送至各缸的火花塞&#xff0c;在其间隙处产生火 花&#xff0c;点燃可燃混合气。 对点火系统的要求是&#xff1a; 在发动机各种工况和条件下&#xff0c;都能…

脉冲触发的触发器

唯一的不同在于时钟信号的控制不一样 前面的叫做主触发器&#xff0c;后面叫做从触发器 为什么在一个时钟周期内只可能改变一次&#xff1f;&#xff08;工作原理&#xff09; 在时钟信号等于0期间&#xff0c;看看时钟信号的工作 CLK1期间&#xff0c;主FF工作&#xff0c;…

【软件分析/静态分析】chapter6 课程08 指针分析(Pointer Analysis)

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a; 南京大学《软件分析》课程08&#xff08;Pointer Analysis&#xff09;_哔哩哔哩_bilibili 目录 第六章 指针分析&#xff08;Pointer Analysis&#xff09; 6.1 为什么需要指针分析 6.2 指针分析的基本…

PWM+RC 滤波的DAC 输出的数学理论

PWM示意图 PWM 本质上其实就是一种周期一定&#xff0c;占空比可调的方波。典型PWM 波形如下 图所示&#xff1a; PWM分段函数 图中的PWM 波形可以用如下分段函数表示&#xff1a; 函数中&#xff1a;T 是单片机中计数脉冲的基本周期&#xff0c;也就是STM32F4 定时器的计数频率…

Python学习笔记(63)~正则基础:非贪心捕获

非贪心捕获 Demo #!/usr/bin/python3 import re # 非贪心&#xff1a;只要找到符合条件的 就返回值 # 贪心 &#xff1a; 近可能将符合条件的放在一次中返回 content<h>ddedadsad</h><div>graph</div>bb<div>math</div>cc patre.compile…