UVA - 11624 Fire! 【BFS】
题意
有一个人 有一些火
人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延
求 人能不能跑出来 如果能 求最小时间
思路
有一个 坑点 火是 可能有 多处 的 样例中 只有一处
然后 先让 火 蔓延 再让人走
BFS
AC代码
#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>
#define CLR(a) memset(a, 0, sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;
const double PI = acos(-1);
const double E = exp(1);
const double eps = 1e-30;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + 5;
const int MOD = 1e9 + 7;
string G[maxn];
int Move[8][2]
{
-1, 0,
1, 0,
0,-1,
0, 1,
-1, 1,
-1,-1,
1, 1,
1,-1,
};
int n, m;
int ans;
bool ok(int x, int y)
{
if (x < 0 || x >= n || y < 0 || y >= m || G[x][y] != '.' )
return false;
return true;
}
bool edge(int x, int y)
{
if (x == 0 || x == n - 1 || y == 0 || y == m - 1)
return true;
return false;
}
struct Node
{
int x, y, step;
}tmp;
queue <Node> fire, q;
void bfs()
{
int len = fire.size();
for (int i = 0; i < len; i++)
{
int x = fire.front().x;
int y = fire.front().y;
fire.pop();
for (int j = 0; j < 4; j++)
{
tmp.x = x + Move[j][0];
tmp.y = y + Move[j][1];
if (ok(tmp.x, tmp.y))
{
G[tmp.x][tmp.y] = 'F';
fire.push(tmp);
}
}
}
len = q.size();
for (int i = 0; i < len; i++)
{
int x = q.front().x;
int y = q.front().y;
int step = q.front().step;
q.pop();
if (edge(x, y))
{
ans = step;
return;
}
for (int j = 0; j < 4; j++)
{
tmp.x = x + Move[j][0];
tmp.y = y + Move[j][1];
if (ok(tmp.x, tmp.y))
{
tmp.step = step + 1;
G[tmp.x][tmp.y] = '*';
q.push(tmp);
}
}
}
if (q.size())
bfs();
}
int main()
{
int t;
cin >> t;
while (t--)
{
while (!fire.empty())
fire.pop();
while (!q.empty())
q.pop();
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
cin >> G[i];
for (int j = 0; j < m; j++)
{
if (G[i][j] == 'J')
{
tmp.x = i;
tmp.y = j;
tmp.step = 0;
q.push(tmp);
G[i][j] = '.';
}
else if (G[i][j] == 'F')
{
tmp.x = i;
tmp.y = j;
fire.push(tmp);
}
}
}
ans = -1;
bfs();
if (ans == -1)
printf("IMPOSSIBLE\n");
else
printf("%d\n", ans + 1);
}
}
UVA - 11624 Fire! 【BFS】的更多相关文章
- uva 11624 Fire! 【 BFS 】
按白书上说的,先用一次bfs,求出每个点起火的时间 再bfs一次求出是否能够走出迷宫 #include<cstdio> #include<cstring> #include&l ...
- UVA 11624 - Fire! 图BFS
看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...
- UVa 11624 Fire!(BFS)
Fire! Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld & %llu Description Joe ...
- (简单) UVA 11624 Fire! ,BFS。
Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ow ...
- UVA - 11624 Fire! 双向BFS追击问题
Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...
- UVA_11624 Fire! 【BFS】
一.题面 略 二.题意分析 一个迷宫中,有一个人Joe和一个或多个起火点,起火点可以蔓延,人可以走动,都只能走4个方向,问人能走出去的最少步数,如果不能输出不可能.很多大佬说是两遍BFS,先一遍火,记 ...
- BFS(两点搜索) UVA 11624 Fire!
题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ...
- UVa 11624 Fire!(着火了!)
UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ...
- UVA 11624 Fire!【两点BFS】
Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the m ...
随机推荐
- 查看网络port占用
Linux和Mac下通用: 1. 利用 netstat 查看网络状态命令: netstat -an|grep port号 2. 利用list open file 命令打开文件(一切都是文件. 包含网 ...
- 对国外某hotel的内网域简单渗透
Penetration Testing不单单是一个博客,更热衷于技术分享的平台. 本文将讲述对国外某一hotel的渗透测试,让更多的人安全意识得到提高,有攻才有防,防得在好,也有疏忽的地方,这就是为啥 ...
- FreeMark的list应用
语法:<#if></#if>后台传送List,前台html页面中获取该list并显示: <#if userList?exists> <#list userLi ...
- 实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中推断不等于end())、operator[])
遍历一个vector容器有非常多种方法.使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << ...
- 一知半见的load与get
http://www.oschina.net/question/5189_3991 我只用get.load不管.
- project修改时间日历
视图→甘特图 格式→时间表→右键时间表 详细的日程表,然后双击时间即可
- apue学习笔记(第十五章 进程间通信)
本章将说明进程之间相互通信的其它技术----进程间通信(IPC) 管道 管道只能在具有公共祖先的两个进程之间只用.通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父进程和子进程之间使 ...
- android xml布局文件中tools:layout的作用
摘要 用最新版本的adt 创建一个基于master/detail flow 模版的app的时候,生成的 activity_item_list.xml 文件中有一个tools:layout属性: fra ...
- 在Linux里环境变量设置的方法(export PATH)
一般来说,配置交叉编译工具链的时候须要指定编译工具的路径,此时就须要环境变量设置.比如我的mips-linux-gcc编译器在"/opt/au1200_rm/build_tools/bin& ...
- Lua学习一----------开发环境搭建
© 版权声明:本文为博主原创文章,转载请注明出处 1.LuaDist下载地址:http://luadist.org/ 2.LuaRocks下载地址:https://github.com/luarock ...