题目链接:https://vjudge.net/problem/UVA-11624

题解:

坑点:“portions of the maze havecaught on fire”, 表明了起火点不唯一。

火和人使用同一种结构体,用id来区别类型。BFS求解:首先将所有火苗入队,然后人再入队(肯定要火苗先入队,因为人要根据火当前烧到哪里来进行移动)。

对于一个尝试点:如果当前的id是人,且走出界,则逃生成功。如果没有走出界,则:

写法一(模拟过程): 如果没有走出界:如果id是火,且此地方是通道,则不管有没有vis过,都把它烧了,即把地图改为‘F’;如果id是人,且此地方是通道且没有被vis过,则进去。

写法二:其实火苗的本质作用是什么?就是禁止人vis那个地方,相当于会扩散的墙。有一点需要注意:对于一个通道,如果人比火先访问,那么其他相邻的通道,都是人先访问的(BFS的特点),所以火在扩散的时候,不用把周围也改为‘F’,直接把它标为vis,对于vis过的点,火和人都 不能再访问。那么我们就不用把火和人分开来处理了:对于一个合法的尝试点,如果此点是通道,则把它标为已经vis,之后入队即可。

写法一:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
#define ms(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = 1e3+; int n, m;
char g[MAXN][MAXN];
int vis[MAXN][MAXN], dir[][] = {,,,,-,,,-}; struct node
{
int x, y, id, step; //id为是人是火的标签
}; queue<node>que;
int bfs()
{
ms(vis, );
while(!que.empty()) que.pop(); node now, tmp;
for(int i = ; i<=n; i++) //先将所有的火一次性放进队列中
for(int j = ; j<=m; j++)
{
if(g[i][j]=='F')
{
now.x = i; now.y = j;
now.step = ; now.id = ;
vis[now.x][now.y] = ;
que.push(now);
}
} for(int i = ; i<=n; i++) //将人放进队列中
for(int j = ; j<=m; j++)
{
if(g[i][j]=='J')
{
now.x = i; now.y = j;
now.step = ; now.id = ;
vis[now.x][now.y] = ;
que.push(now);
}
} while(!que.empty())
{
now = que.front();
que.pop(); for(int i = ; i<; i++)
{
tmp.x = now.x + dir[i][];
tmp.y = now.y + dir[i][];
tmp.step = now.step + ;
tmp.id = now.id;
if(tmp.id== && (tmp.x< || tmp.x>n || tmp.y< || tmp.y>m) ) //如果是人,且走出界,则逃生成功
return tmp.step; if(tmp.x>= && tmp.x<=n && tmp.y>= && tmp.y<=m) //位置合法
{
//如果是火,并且可以燃烧,不过他有没有vis过,都把它给烧了
if(tmp.id== && g[tmp.x][tmp.y]=='.' || g[tmp.x][tmp.y]=='J' )
{
g[tmp.x][tmp.y] = 'F'; //这个地方变成火了
que.push(tmp);
}
//如果是人,并且这个地方是通道可没有vis过,则可行
if(tmp.id== && g[tmp.x][tmp.y]=='.' && !vis[tmp.x][tmp.y])
{
vis[tmp.x][tmp.y] = ;
que.push(tmp);
}
}
}
}
return -;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d", &n, &m);
for(int i = ; i<=n; i++)
scanf("%s", g[i]+); int ans = bfs();
if(ans==-)
puts("IMPOSSIBLE");
else
printf("%d\n", ans);
}
}

写法二:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
#define ms(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = 1e3+; int n, m;
char g[MAXN][MAXN];
int vis[MAXN][MAXN], dir[][] = {,,,,-,,,-}; struct node
{
int x, y, id, step;
}; queue<node>que; int bfs()
{
ms(vis, );
while(!que.empty()) que.pop(); node now, tmp;
for(int i = ; i<=n; i++)
for(int j = ; j<=m; j++)
{
if(g[i][j]=='F')
{
now.x = i; now.y = j;
now.step = ; now.id = ;
vis[now.x][now.y] = ;
que.push(now);
}
} for(int i = ; i<=n; i++)
for(int j = ; j<=m; j++)
{
if(g[i][j]=='J')
{
now.x = i; now.y = j;
now.step = ; now.id = ;
vis[now.x][now.y] = ;
que.push(now);
}
} while(!que.empty())
{
now = que.front();
que.pop(); for(int i = ; i<; i++)
{
tmp.x = now.x + dir[i][];
tmp.y = now.y + dir[i][];
tmp.step = now.step + ;
tmp.id = now.id;
if(tmp.id== && (tmp.x< || tmp.x>n || tmp.y< || tmp.y>m) ) //逃生成功
return tmp.step; if(tmp.x>= && tmp.x<=n && tmp.y>= && tmp.y<=m
&& !vis[tmp.x][tmp.y] && g[tmp.x][tmp.y]=='.' ) //如果此地方是通道且没有被vis,则把它标为vis
{
vis[tmp.x][tmp.y] = ;
que.push(tmp);
}
}
}
return -;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d", &n, &m);
for(int i = ; i<=n; i++)
scanf("%s", g[i]+); int ans = bfs();
if(ans==-)
puts("IMPOSSIBLE");
else
printf("%d\n", ans);
}
}

UVA11624 Fire! —— BFS的更多相关文章

  1. uva11624 - Fire!

    uva11624 - Fire! 火在蔓延,人在走.火会蔓延,不会熄灭,我们可以确定某个点着火的时间(广搜).对于J来说,要是他走到某点的时间比火蔓延到该点的时间要短,那么他走到该点的时候,火还没蔓延 ...

  2. uva11624 Fire! (bfs预处理)

    题目链接:https://vjudge.net/problem/UVA-11624 题意:给一个1000×1000的矩阵,有几个着火点和Joe,着火点和Joe每个单位时间均移动一个单位,求Joe逃出的 ...

  3. UVA11624(bfs)

    题意:给一张图,有火源,有障碍物,剩下的是道路,火源在下一分钟能够让上下左右四个方向的道路也着火,告诉人的位置,问最短时间能逃出去的时间是多少: 思路:一个bfs用来求出所有的火源能蔓延到的地方,另一 ...

  4. UVA 11624 Fire! (bfs)

    算法指南白书 分别求一次人和火到达各个点的最短时间 #include<cstdio> #include<cstring> #include<queue> #incl ...

  5. UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次

    UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...

  6. Fire!(BFS)

    Fire! Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Descr ...

  7. UVA 11624 Fire! BFS搜索

    题意:就是问你能不能在火烧到你之前,走出一个矩形区域,如果有,求出最短的时间 分析:两遍BFS,然后比较边界 #include<cstdio> #include<algorithm& ...

  8. UVA 11624 Fire! bfs 难度:0

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  9. ACM: FZU 2150 Fire Game - DFS+BFS+枝剪 或者 纯BFS+枝剪

    FZU 2150 Fire Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

随机推荐

  1. maven配置中国下载源【转:http://www.cnblogs.com/libingbin/p/5949483.html】

    修改 配置文件 maven 安装 路径 F:\apache-maven-3.3.9\conf 修改 settings.xml或者在.m2文件夹下新建一个settings.xml 阿里源 <mir ...

  2. 标准C程序设计七---01

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  3. linux的cpu性能评估

    linux的cpu性能评估 参考自:自学it网,http://www.zixue.it/. (1)利用vmstat命令监控系统CPU[test@localhost ~]$ vmstat 2 3 #每2 ...

  4. JavaScript 实现格式化字符串函数String.format (解决引号嵌套转义符问题)

    在js开发中,我们可能会遇到这样一个问题 当需要通过js动态插入html标签的时候 特别是当遇到大量的变量拼接.引号层层嵌套的情况,会出现转义字符问题,经常出错 我们来看个例子 <!DOCTYP ...

  5. rman备份OBSOLETE和EXPIRED参数来历及区别

    http://blog.itpub.net/30496894/viewspace-2096221/

  6. Angular Material & Hello World

    前言 Angular Material(下称Material)的组件样式至少是可以满足一般的个人开发需求(我真是毫无设计天赋),也是Angular官方推荐的组件.我们通过用这个UI库来快速实现自己的i ...

  7. webstorm调试(一)提示css未使用的选择器Selector is never used

    一.css未使用的选择器Selector 今天写vue的时候,给动态绑定了一个class属性,然后样式里面就给了warning,看起来怪怪的,很不舒服

  8. ImportError: No module named _curses;Color support is disabled, python-curses is not installed.解决办法

    linux系统默认安装了python2.6, 但是发现python2.7 import curses时 提示 找不到_curses 错误.  用pip(python2.7 )安装了curses-204 ...

  9. sshd登录攻击

    先说简单的防范措施: 1.密码足够复杂 密码的长度大于8位.有数字.大小写字母.特殊字符组合. 2.nmap 扫描 为了避免被扫描到, #看到端口是81 ssh root@192.168.1.63 玩 ...

  10. Hive 外部表 分区表

      之前主要研究oracle与mysql,认为hive事实上就是一种数据仓库的框架,也没有太多另类,所以主要精力都在研究hadoop.hbase,sqoop,mahout,近期略微用心看了下hive. ...