逃脱 (简单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来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园某处的 ...
随机推荐
- JS高级 — 函数中的this指向问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- 07.Linux-CentOS系统库文件libaudit.so.1丢失问题
问题:缺少共享库文件sudo: error while loading shared libraries: libaudit.so.1: cannot open shared object file: ...
- [SDOI2017]数字表格 (莫比乌斯反演)
链接:https://ac.nowcoder.com/acm/problem/20391来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 【LeetCode】从contest-21开始。(一般是10个contest写一篇文章)
[LeetCode Weekly Contest 29][2017/04/23] 第17周 Binary Tree Tilt (3) Array Partition I (6) Longest Lin ...
- Center os 用户环境变量
vi ~/.bash_profile进入用户环境变量设置 export JAVA_HOME=/usr/java/jdk1.7.0_76export JAVA_BIN=$JAVA_HOME/binexp ...
- fastjson 1.1.1填坑
java封装Echart数据模型 xAxis yAxis 属性 转json赋值失败..换名即可 解决办法:升级1.2.2后即可
- GSL--GNU Scientific Library 小记
摘自http://qianjigui.iteye.com/blog/847612 GSL(GNU Scientific Library)是一个 C 写成的用于科学计算的库,下面是一些相关的包 Desi ...
- Vue-cli 项目设置每个页面标题
页面标题 在vue-router页面配置中添加meta的title信息,配合vue-router的beforeEach注册一个前置守卫用户获取到页面配置的title const title = '移动 ...
- SSH框架整合-myeclipse
项目结构 1.mysql数据库 stuinfo /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.40 : Database - stuinfo ****** ...
- SQL server 2008 数据库优化常用脚本
--查询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前名其他等待类型 * from sys. ...