uva11624 - Fire!

火在蔓延,人在走。火会蔓延,不会熄灭,我们可以确定某个点着火的时间(广搜)。对于J来说,要是他走到某点的时间比火蔓延到该点的时间要短,那么他走到该点的时候,火还没蔓延过来,他就可以走到该点,否则,不能进入该点。

数据地图表示:

-1         该点是墙或已经走过,不能走

-2         该点是通道还没有走过,火还没蔓延过来,可以走

0-x       该点在第x秒时,火能蔓延到该点

处理过程:

(1)输入并初始化,初步处理地图数据

(2)广搜标记地图,确定火蔓延情况

(3)广搜逃亡路线。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue> using namespace std; int n,m; //地图大小
int sx,sy; //起始位置
int map[1002][1002]; //地图存储。“-1”是不能走,“-2” 是能走,“0-x”是火蔓延过来的时间
int dir[4][2]={1,0,0,1,-1,0,0,-1}; //四个方向 struct node //搜索结构体
{
int x;
int y;
int step;
}s,e; queue<node> q; //搜索共用队列 void initial() //地图,队列初始化
{
int i,j;
char x[1002]; //暂存数组 memset(map,-1,sizeof(map)); //全部初始化为0
while(!q.empty())q.pop(); //情况队列 cin>>n>>m; for(i=0;i<n;i++) //输入地图,并处理
{
cin>>x;
for(j=0;j<m;j++)
{
if(x[j]=='.')map[i][j]=-2; //此处可走
else if(x[j]=='F') //此处有火
{
map[i][j]=0;
s.x=i;
s.y=j;
s.step=0;
q.push(s);
}
else if(x[j]=='J')sx=i,sy=j; //起点
} //由于最开始全部赋值为-1,都默认为不能走,所以,输入为“#”时,不用再处理
} while(!q.empty()) //广度优先搜索,确定火蔓延到每个点的时间【可能蔓延不到】
{
s=q.front();
q.pop(); for(i=0;i<4;i++)//四个方向搜索
{
e.x=s.x+dir[i][0];
e.y=s.y+dir[i][1];
e.step=s.step+1;
if(e.x<0||e.x>=n||e.y<0||e.y>=m||map[e.x][e.y]!=-2)continue; //该点在地图外面或该点不可被蔓延,不处理该点
map[e.x][e.y]=e.step; //记录蔓延过来的时间
q.push(e);
} }
} int bfsescap() //逃亡广搜,能逃亡成功就返回时间,否则,返回-1
{
s.x=sx;
s.y=sy;
s.step=1;
map[sx][sx]=-1;
q.push(s); //起点入队 while(!q.empty())
{
s=q.front(); if(s.x==n-1||s.x==0||s.y==m-1||s.y==0) return s.step; //起点要判断,放这里更合适【这点的疏忽,让我郁闷了三天】逃亡成功 q.pop(); for(int i=0;i<4;i++) //四个方向搜索
{
e.x=s.x+dir[i][0];
e.y=s.y+dir[i][1];
e.step=s.step+1;
if(e.x<0||e.x>=n||e.y<0||e.y>=m||(map[e.x][e.y]!=-2&&map[e.x][e.y]<e.step))continue; //不可走,不处理
map[e.x][e.y]=-1;
q.push(e);
} }
return -1; //所有能走的地方都走了,还是没有逃出去。逃亡失败
} int main()
{
int t; cin>>t; //案例测试数据组数 while(t--)
{
initial(); //输入,赋值处理等初始化 int ans=bfsescap(); //逃亡广搜 if(ans==-1)cout<<"IMPOSSIBLE"<<endl; //结果分析,所有能走的节点都走过了,还没有逃出迷宫
else cout<<ans<<endl;
} return 0;
}

uva11624 - Fire!的更多相关文章

  1. UVA11624 Fire! —— BFS

    题目链接:https://vjudge.net/problem/UVA-11624 题解: 坑点:“portions of the maze havecaught on fire”, 表明了起火点不唯 ...

  2. uva11624 Fire! (bfs预处理)

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

  3. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  4. 【UVA - 11624】Fire!

    -->Fire! 直接上中文 Descriptions: 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块 ...

  5. kuangbin专题 专题一 简单搜索 Fire! UVA - 11624

    题目链接:https://vjudge.net/problem/UVA-11624 题意:一个迷宫,可能有一个或者多个地方着火了,每过1个时间消耗,火会向四周蔓延,问Joe能不能逃出迷宫,只要走出迷宫 ...

  6. 关于SequeezeNet中的Fire Module

    在论文<SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE>中,作者 ...

  7. FZU 2150 Fire Game

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

  8. Fire

    Fire 分析: 首先,明确题意:b1,b2,--,bn 交换为b2,--,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...

  9. Android 轻量级输入校验库:Fire Eye

    Fire Eye是一款轻量级简单易用的Android校验库. FireEye 2.0 在 1.0 的基础上,全部重写了代码,并优化了架构,性能上和逻辑上都大大提升.只需要几行代码,即可验证用户输入,并 ...

随机推荐

  1. 带中文索引的ListView 仿微信联系人列表

    因为各种原因,项目经理和产品经理把我做的东西给否定了,所以决定分享出去. 主要功能: 1 .带中文索引的ListView 2.自己定义顶部搜索视图,能够对返回button,搜索button加入事件监听 ...

  2. 多封装,少开放。强烈建议C++标准添加class之间的注入机制

    近日在改动了一下下引擎代码(为了自己的组件),发现有些接口是仅仅有特定类及其内部函数才去訪问,却不使用友元声明的形式进行数据訪问--当然使用了普通非virtual的形式也就是意味着不建议重载. 故此: ...

  3. iOS应用性能调优的25个建议和技巧【转】

    转载自:http://blog.jobbole.com/37984/ 首页 最新文章 资讯 程序员 设计 IT技术 创业 在国外 营销 趣文 特别分享 更多 > - Navigation -  ...

  4. python-文件压缩和解压

    import tarfile #压缩 tar = tarfile.open('your.tar','w') tar.add('ooo.xml',arcname='ooo.xml') tar.close ...

  5. DEV LookUpEdit 使用方法

    public class field { public string Name { get; set; } public string Explain { get; set; } } List< ...

  6. Sublime Text3 Package Control和Emmet插件安装方法

    因为初学前端,所以今天安装了Sumblime Text 3,然后就停不下来去找Package Control的安装方法. 网络上我找到并尝试过的方法有两种,我使用的是用Python代码去安装并成安装成 ...

  7. 使用 Fluent API 配置/映射属性和类型2

    1.将多个实体类映射到数据库中的一个表 要将多个实体映射到一个数据库表需要满足: a. 两个实体必须是一对一关系 b.两个实体共享一个主键 public class MyContext:DbConte ...

  8. Web C# 导出Excel 方法总结

    方法1:微软推荐服务器需安装Excel型 依赖: 软件:Office Excel 2007-2013 引用:Microsoft Office 14.0 Object Library 1.1 数据准备 ...

  9. js中的for-of循环遍历数组

    遍历数组要怎么做,可能你首先想到的会是for循环,当然for循环在JavaScript 刚萌生的时候就出现了,想到它也是理所当然的 var a=[[1,2],[3,4],5] for(var i=0; ...

  10. Java的一点内容(2)

    1 面向对象的三个原则 封装性 封装的基本单元是类(class),类是一个抽象的逻辑结构,而类的对象是一个真实的物理实体:类的目的是封装复杂性,在类内部存在隐藏实现复杂性机制: 封装(encapsul ...