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开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单 ...
随机推荐
- Python 豆瓣顶帖
由于在豆瓣发了个租房帖子,发现很快就被其他的帖子淹没,但是手动顶帖实在太累,
- [hadoop]mapreduce原理简述
1.用于map的输入,先将输入数据切分成相等的分片,为每一个分片创建一个map worker,这里的切片大小不是随意订的,一般是与HDFS块大小一致,默认是64MB,一个节点上存储输入数据切片的最大s ...
- Centos7网络配置(VMware)
在VM虚拟机上装了Centos7,想要用xshell5连接操作,配置网络花了整整一个上午的时间,真是心酸. 登陆后,使用命令 ip addr查看了本机的网络 可以看到我的网络配置文件是ens33, 使 ...
- 弗罗贝尼乌斯範数(Frobenius norm)
弗罗贝尼乌斯範数 对 p = 2,这称为弗罗贝尼乌斯範数(Frobenius norm)或希尔伯特-施密特範数( Hilbert–Schmidt norm),不过后面这个术语通常只用于希尔伯特空间.这 ...
- 关于项目中根据当前数据库中最大ID生成下一个ID问题——(五)
1.关于部门管理时候根据上级产生下级部门ID的问题(传入一个参数是上级部门id)
- LINUX vim 修改文件 退出
vim 保存退出, 先按ESC ,然后:wq(保存退出)W:write,写入 Q:quit,退出, 也可以直接输入X,代表WQ,也是保存退出 或者 先按ESC,再按shift+ZZ 也是保存退出 正常 ...
- Java数据类型以及变量的定义
1130136248 Java的基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类 ...
- centos7联网
一般centos安装(在虚拟机上安装)完成后需要自己配置服务,下面我就讲下如何配置 配置联网步骤 首先,打开虚拟机的两个服务,右击我的电脑-->管理--->找到服务-->右击启动 两 ...
- mysql自增id归0
mysql自增id归0 ALTER TABLE table_name AUTO_INCREMENT=1;
- linux tomcat 突然验证码出不来
情况描述 虚拟机上用tomcat部署的web应用,本来都还可以的.后来打了一个快照进行过压缩后,重新起虚拟机发现应用登录界面的验证码出不来了,具体报的是500错误. 参见http://www.blog ...