逃脱 (简单BFS)
G逃脱
题目描述
幼儿园可以看成是一个N*M的图,在图中一共包含以下几种元素:
“.”:表示这是一块空地,是可以随意穿梭的。
“#”:表示这是一块墙,是不可以走到这上边来的,但是可以被火烧毁。
“S”:表示mengxiang000和Tabris所在位子。
“E”:表示幼儿园的出口。
“*”表示火灾发源地(保证输入只有一个火灾发源地)。
已知每秒有火的地方都会向周围八个格子(上下左右、左上、右上、左下、右下)蔓延火势.mengxiang000和Tabris每秒都可以选择周围四个格子(上下左右)进行移动。(假设两人这一秒行动完之后,火势才蔓延开)
输入描述:
第一行输入一个整数t,表示一共的测试数据组数。
第二行输入两个整数n,m,表示幼儿园的大小。
接下来n行,每行m个字符,表示此格子是什么元素。
t<=200
3<=n<=30
3<=M<=30
保证图中有一个起点,一个出口,一个火灾源处
输出描述:
每组数据输出一行,如果两人能够成功到达出口,那么输出最短逃离时间,否则输出T_T
输入:
3
5 5
*....
.....
..S#.
...E.
.....
5 5
...#*
..#S#
...##
....E
.....
5 5
.....
S....
..*#.
...E.
.....
输出:
2
T_T
T_T
题意:就是两个人再S这个点,然后火灾*这里会向八个方向蔓延,求逃离最短时间,否则输出T_T;
题解:简单bfs,但是要注意WA点:如果到达了E,火再蔓延过来没事;如果到达了‘.’,火蔓延过来还是会死。
因为这个WA了好几发
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX 35
#define INF 0x3f3f3f3f
int n,m;
int T;
char g[MAX][MAX];
bool vis[MAX][MAX];
int fire[MAX][MAX];
int ans=INF;
int dx[]={,,,-},dy[]={,,-,};
int sx,sy;
int fx,fy;
struct mask
{
int x,y,step;
mask(){}
mask(int x,int y,int step):x(x),y(y),step(step){};
};
queue<mask>q;
bool check(int a,int b){return <=a&&a<n&&<=b&&b<m;}
void fire_path()
{
memset(vis,false,sizeof(vis));
memset(fire,,sizeof(fire));
while(q.size()) q.pop();
q.push(mask(fx,fy,));
vis[fx][fy]=true;
fire[fx][fy]=;
while(q.size())
{
mask tmp=q.front();q.pop();
for(int i=-;i<=;i++)
for(int j=-;j<=;j++)
{
int nx=tmp.x+i;
int ny=tmp.y+j;
if(check(nx,ny)&&!vis[nx][ny])
{
vis[nx][ny]=true;
fire[nx][ny]=tmp.step+;
q.push(mask(nx,ny,tmp.step+));
}
}
}
}
void bfs()
{
memset(vis,false,sizeof(vis));
while(q.size()) q.pop();
vis[sx][sy]=true;
q.push(mask(sx,sy,));
while(q.size())
{
mask tmp=q.front();q.pop();
if(g[tmp.x][tmp.y]=='E')
{
ans=min(ans,tmp.step);
return ;
}
for(int i=;i<;i++)
{
int nx=dx[i]+tmp.x;
int ny=dy[i]+tmp.y;
//注意这里要讨论一下
if(g[nx][ny]=='E'&&tmp.step+<=fire[nx][ny])
{
vis[nx][ny]=true;
q.push(mask(nx,ny,tmp.step+));
}
if(check(nx,ny)&&!vis[nx][ny]&&g[nx][ny]!='#'&&tmp.step+<fire[nx][ny])
{
vis[nx][ny]=true;
q.push(mask(nx,ny,tmp.step+));
}
}
}
}
int main()
{
cin>>T;
while(T--){
cin>>n>>m;
for(int i=;i<n;i++)
{
cin>>g[i];
for(int j=;j<m;j++)
{
if(g[i][j]=='S')
{
sx=i;
sy=j;
}
if(g[i][j]=='*')
{
fx=i;
fy=j;//cout<<i<<j<<endl;
}
}
}
ans=INF;
fire_path();
/*for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<fire[i][j];
cout<<endl;
}*/
bfs();
if(ans==INF)
cout<<"T_T"<<endl;
else cout<<ans<<endl;
}
}
逃脱 (简单BFS)的更多相关文章
- LightOJ 1012 简单bfs,水
1.LightOJ 1012 Guilty Prince 简单bfs 2.总结:水 题意:迷宫,求有多少位置可去 #include<iostream> #include<cstr ...
- POJ3185(简单BFS,主要做测试使用)
没事做水了一道POJ的简单BFS的题目 这道题的数据范围是20,所以状态总数就是(1<<20) 第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实 ...
- 【POJ 3669 Meteor Shower】简单BFS
流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...
- hdu1312 Red and Black 简单BFS
简单BFS模版题 不多说了..... 直接晒代码哦.... #include<cstdlib> #include<iostream> #include<cstdio> ...
- poj2251 三维简单BFS
D - (热身)简单宽搜回顾 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- hdu2717Catch That Cow 简单BFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 刚开始思路错了,用的DP,一直WA,后来才发现是搜索,还是简单的BFS,顿时.... 思路: B ...
- luogu 2296 寻找道路 简单BFS
简单的BFS,练习基础 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #defi ...
- poj 3414(简单bfs)
题目链接:http://poj.org/problem?id=3414 思路:bfs简单应用,增对瓶A或者瓶B进行分析就可以了,一共6种状态. #include<iostream> #in ...
- hrbust1444 逃脱 【BFS】
Description 这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的 ...
随机推荐
- Sybase 修改数据库默认排序
我新建了一个sybase数据库,想用dump文件load,可是报数据库的排序不对,就去Centrol里面修改,但是还是报错,说是字符集不存在.办法如下: 打开命令行,进入到sybase的ASE-15_ ...
- k8s阅读笔记2-k8s架构
前言 阅读地址 https://rootsongjc.gitbooks.io/kubernetes-handbook/content/concepts/ 架构 架构图说明: master 指服务端 1 ...
- 一、Angular环境的搭建
1.安装nodejs (1) 下载网址https://nodejs.org/en/download/ (2) 双击进行安装 (3) 打开命令行,输入node -v 和 npm -v 查看是否安装成功 ...
- python 模仿 C/C++ 结构体
import struct from ctypes import * class MyStruct(Structure): _fields_ = [ ("v1", c_char), ...
- BiNGO的GO分析
GO富集分析对老师们来说想必都不陌生,几乎在任何项目中都会出现.今天就给大家介绍一款简单易学又好用的富集分析小软件---BiNGO.它是Cytoscape软件中很出色的一个插件.它提供的结果中除了文本 ...
- 每天一个linux命令:less(14)
less less命令的作用与more十分相似,都可以用来浏览文字档案的内容,less 在查看之前不会加载整个文件 .用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页. ...
- 线程join方法demo-模拟叫号看病
package cn.chapter4.test5; public class SicknessDemo { /** * 模拟叫号看病 * @param args * * 思路:把普通号看病写在主线程 ...
- mybatis模糊查询(转载)
原文地址:http://blog.csdn.net/luqin1988/article/details/7865643 模糊查询: 1. sql中字符串拼接 SELECT * FROM tableNa ...
- BZOJ 4399: 魔法少女LJJ(线段树)
传送门 解题思路 出题人真会玩..操作\(2\)线段树合并,然后每棵线段树维护元素个数和.对于\(6\)这个询问,因为乘积太大,所以要用对数.时间复杂度\(O(nlogn)\) 代码 #include ...
- NOIP 历年试题大致考点总结
总的来说,水平还不够-- 要努力了! NOIP2012 D1T1 模拟, 字符串 D1T2 贪心, 数学 (推导贪心策略), 高精度 D1T3 unsolved 开车旅行 倍增 D2T1 解线性模方程 ...