CSUOJ 2031 Barareh on Fire
Description
The Barareh village is on fire due to the attack of the virtual enemy. Several places are already on fire and the fire is spreading fast to other places. Khorzookhan who is the only person remaining alive in the war with the virtual enemy, tries to rescue himself by reaching to the only helicopter in the Barareh villiage. Suppose the Barareh village is represented by an n × m grid. At the initial time, some grid cells are on fire. If a cell catches fire at time x, all its 8 vertex-neighboring cells will catch fire at time x + k. If a cell catches fire, it will be on fire forever. At the initial time, Khorzookhan stands at cell s and the helicopter is located at cell t. At any time x, Khorzookhan can move from its current cell to one of four edge-neighboring cells, located at the left, right, top, or bottom of its current cell if that cell is not on fire at time x + 1. Note that each move takes one second. Your task is to write a program to find the shortest path from s to t avoiding fire.
Input
There are multiple test cases in the input. The first line of each test case contains three positive integers n, m and k (1 ⩽ n,m,k ⩽ 100), where n and m indicate the size of the test case grid n × m, and k denotes the growth rate of fire. The next n lines, each contains a string of length m, where the jth character of the ith line represents the cell (i, j) of the grid. Cells which are on fire at time 0, are presented by character “f”. There may exist no “f” in the test case. The helicopter and Khorzookhan are located at cells presented by “t” and “s”, respectively. Other cells are filled by “-” characters. The input terminates with a line containing “0 0 0” which should not be processed.
Output
For each test case, output a line containing the shortest time to reach t from s avoiding fire. If it is impossible to reach t from s, write “Impossible” in the output.
Sample Input
7 7 2
f------
-f---f-
----f--
-------
------f
---s---
t----f-
3 4 1
t--f
--s-
----
2 2 1
st
f-
2 2 2
st
f-
0 0 0
Sample Output
4
Impossible
Impossible
1
Hint
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct point{
int x, y,time;
};
int vis[110][110],vis1[110][110], time_[110][110], dir[8][2] = {1,0, 0,1, -1,0, 0,-1, 1,1, 1,-1, -1,1, -1,-1};
char map[110][110];
int m, n, k,time1;
queue<point>q; bool check(int x,int y)
{
if (x >= 0 && y >= 0 && x < n&&y < m)
return true;
else
return false;
} void bfs1()
{
point u, v;
while (!q.empty())
{
u = q.front();
q.pop();
for (int i = 0; i < 8; i++)
{
v.x = u.x + dir[i][0];
v.y = u.y + dir[i][1];
v.time = u.time + k;
if (check(v.x, v.y) && !vis[v.x][v.y])
{
q.push(v);
vis[v.x][v.y] = 1;
time_[v.x][v.y] = v.time;
}
}
}
} bool bfs2()
{
point u, v;
while (!q.empty())
{
u = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
v.x = u.x + dir[i][0];
v.y = u.y + dir[i][1];
v.time = u.time + 1;
if (check(v.x, v.y) && v.time < time_[v.x][v.y]&&!vis1[v.x][v.y])
{
if (map[v.x][v.y] == 't')
{
time1 = v.time;
return true;
}
vis1[v.x][v.y] = 1;
q.push(v);
}
}
}
return false;
}
int main()
{
while (~scanf("%d%d%d", &n, &m, &k))
{
int num = 0;
if (!n&&!m&&!k)
break;
while (!q.empty())
q.pop();
memset(vis, 0, sizeof(vis));
memset(vis1, 0, sizeof(vis1));
for (int i = 0; i < n; i++)
{
scanf("%s", map[i]);
} point u,v;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (map[i][j] == 'f')
{
time_[i][j] = 0;
vis[i][j] = 1;
q.push(point{ i, j,0 });
num++;
}
if (map[i][j] == 's')
{
u.x = i; u.y = j; u.time = 0;
vis1[u.x][u.y] = 1;
}
if (map[i][j] == 't')
{
v.x = i; v.y = j;
}
}
}
if (num == 0)//注意可能没有火!!!!之前比赛的时候死在了这里
{
time1 = abs(v.x - u.x) + abs(v.y - u.y);
printf("%d\n", time1);
continue;
} bfs1();
while (!q.empty())
q.pop(); q.push(u);
if (bfs2())
printf("%d\n", time1);
else
printf("Impossible\n");
}
return 0;
} /**********************************************************************
Problem: 2031
User: leo6033
Language: C++
Result: AC
Time:12 ms
Memory:2308 kb
**********************************************************************/
CSUOJ 2031 Barareh on Fire的更多相关文章
- CSU - 2031 Barareh on Fire (两层bfs)
传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2031 Description The Barareh village is on f ...
- CSU-2031 Barareh on Fire
CSU-2031 Barareh on Fire Description The Barareh village is on fire due to the attack of the virtual ...
- 2018湖南多校第二场-20180407 Barareh on Fire
Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...
- CSU 2031
2031: Barareh on Fire Submit Page Summary Time Limit: 3 Sec Memory Limit: 512 Mb Submitt ...
- CSU-ACM2018暑假集训6—BFS
可以吃饭啦!!! A:连通块 ZOJ 1709 Oil Deposits(dfs,连通块个数) B:素数变换 打表+bfs POJ 3216 Prime Path(打表+bfs) C:水bfs HDU ...
- CSUOJ2031-Barareh on Fire(双向BFS)
Barareh on Fire Submit Page Description The Barareh village is on fire due to the attack of the virt ...
- 关于SequeezeNet中的Fire Module
在论文<SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE>中,作者 ...
- FZU 2150 Fire Game
Fire Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- Fire
Fire 分析: 首先,明确题意:b1,b2,--,bn 交换为b2,--,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...
随机推荐
- 阮一峰:自适应网页设计(Responsive Web Design)别名(响应式web设计)
随着3G的普及,越来越多的人使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通 ...
- 纯javascript代码实现浏览器图片选择预览、旋转、批量上传
工作中遇到的业务场景,和同事一起研究了下,主要是为了兼容IE版本 其实就是一些琐碎的知识点在网上搜集下解决方式,然后集成了下,主要有以下点: 1. IE input type=file的图片预览要用I ...
- 天梯 1083 Cantor表
解题报告:发现规律就可以了,斜着看,第一条线上有1个,第二条线上有2个,....然后求出等差数列前n项和,求出N在第几条线上,然后就看N是在这条线上的第几个就可以了. #include<cstd ...
- 2016.07.15——istringstream测试
istringstream测试 1.istringstream strcin(str),字符串(str)可以包括多个单词,单词之间使用空格分开 #include "stdafx.h" ...
- FPGA设计方法检查表
-----------------------摘自<FPGA软件测试与评价技术> 中国电子信息产业发展研究院 | 编著------------------------------- 文本格 ...
- Redis—数据结构之sds
Redis是一个Key Value数据库.Redis有5种数据类型:字符串.列表.哈希.集合.有序集合.而字符串的底层实现方法之一就是使用sds.以下描述中请读者注意区分sds是指简单动态字符串这一数 ...
- linux shell语言编程规范安全篇之通用原则【转】
shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...
- Python 使用 Redis 操作
1.redis简介 redis是一款开源免费的高性能key-value数据库,redis特点: 支持更多的数据类型:字符串(String).列表(List).哈希(Map).数字(Int).集合(Se ...
- No.18 selenium学习之路之批量执行测试用例
diascover方法,加载所有测试用例 1.discover方法里面有三个参数: -case_dir:测试用例的目录 -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开 ...
- 洛谷P3760异或和
传送门啦 传送门啦 一般这种位运算的题都要把每一位拆开来看,因为位运算每个位的结果这和这一位的数有关. 这样我们用s[i]表示a的前缀和,即 $ a[1]+a[2]+....a[i] $ ,然后我们从 ...