UVA 11624--Fire!
来源:互联网 发布:网络语言ph是什么意思 编辑:程序博客网 时间:2024/06/05 22:44
题目:这是题目
题意:John在迷宫工作,迷宫着火了,火从四个方向扩散,问John是否能够逃出来。
思路:宽搜,两个宽搜,一个是火,一个是John。有以下几点要注意:
1. 火的位置可能有多个,之前wa在这。从“Unfortunately, portions of the maze havecaught on fire”可以得知。
2. John就在出口(边界),后来wa在这没有考虑到。
3. 我是火和John同时搜的,但是先判断火会不会烧到,然后再判断人要不要走,所以后来错在取人能走的路的队首判断是否是边界,但是由于我是先判断火的,火会把John在的出口烧了,所以会判断为走不出来,即样例
3 3
#JF
###
###
本来应该是1,结果我是IMPOSSIBLE。
所以在外面就判断一下起点是否是终点。
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>#include <math.h>using namespace std;const int MAX = 1005;const int INF = 0x3f3f3f3f;char _map[MAX][MAX];bool visit[MAX][MAX];int d[MAX][MAX];int x[4] = {-1, 0, 1, 0};int y[4] = {0, 1, 0, -1};int co;int r, c;int sx, sy;int num;struct node { int xi, yi; int step;}ff[MAX * MAX], jj[MAX * MAX], f[MAX * MAX];bool OK(node en) { if ((en.xi == 0 || en.xi == r - 1 || en.yi == 0 || en.yi == c - 1) && !visit[en.xi][en.yi]) { return true; } return false;}bool bfs() { queue <node> q; node start; start.xi = sx; start.yi = sy; start.step = 1; d[sx][sy] = 1; q.push(start); queue <node> fire; for (int i = 0; i < co; i++) { fire.push(f[i]); } while (!q.empty()) { int k1 = 0; while (!fire.empty()) { node fhead, ftail; fhead = fire.front(); fire.pop(); for (int i = 0; i < 4; i++) { int xx = fhead.xi + x[i]; int yy = fhead.yi + y[i]; if (xx >= 0 && xx < r && yy >= 0 && yy < c && !visit[xx][yy]) { ftail.xi = xx; ftail.yi = yy; visit[xx][yy] = true; ff[k1++] = ftail; } } } for (int i = 0; i < k1; i++) fire.push(ff[i]);//前1s火能够到的点 int k2 = 0; while(!q.empty()) { node head, tail; head = q.front(); q.pop();// if (OK(head)) {// num = head.step;// return true;// }//之前wa在这,在队首判断,会出错 for (int i = 0; i < 4; i++) { int xx = head.xi + x[i]; int yy = head.yi + y[i]; if (xx >= 0 && xx < r && yy >= 0 && yy < c && !visit[xx][yy] && d[xx][yy] > head.step + 1) { tail.xi = xx; tail.yi = yy; tail.step = head.step + 1; d[xx][yy] = tail.step; jj[k2++] = tail; if (OK(tail)) { num = tail.step; return true; }//每入一个点判断是否是出口 } } } for (int i = 0; i < k2; i++) q.push(jj[i]);//前1s John能走到的点 } return false;}int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d", &r, &c); co = 0; memset(visit, false, sizeof(visit)); for (int i = 0; i < r; i++) scanf("%s", _map[i]); for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { d[i][j] = INF; if (_map[i][j] == 'J') { sx = i; sy = j; } else if (_map[i][j] == '#') { visit[i][j] = true; } else if (_map[i][j] == 'F') {//可能多处火 f[co].xi = i; f[co].yi = j; co++; visit[i][j] = true; } } } node start; start.xi = sx; start.yi = sy; if (OK(start)) { printf("1\n"); }//判断起点是否是出口 else if (bfs()) { printf("%d\n", num); } else { printf("IMPOSSIBLE\n"); } } return 0;}
0 0
- UVa 11624 - Fire!
- UVA 11624 - Fire!
- Uva-11624-Fire!
- uva 11624 Fire!
- uva 11624 - Fire!
- UVa 11624 - Fire!
- UVa 11624 Fire!
- UVA 11624 BFS Fire
- UVa Fire! 11624 (BFS)
- UVA - 11624 Fire!
- uva 11624 - Fire! bfs
- UVA 11624 Fire!
- UVa 11624 Fire! / BFS
- UVa:11624 Fire!
- UVA - 11624 Fire!
- UVa 11624 - Fire!
- uva 11624 Fire
- Uva 11624 Fire!
- 文件夹之间的拷贝
- hdu 4715 Difference Between Primes 筛法
- Android dex加载过程分析
- java 多线程的三种创建方式
- Module won't show up in “Edit Configuration”
- UVA 11624--Fire!
- 中软Java学习第八天笔记之Set
- c++ 学习之路 第六天 auto decltype
- java异常处理机制
- 串结构练习——字符串连接
- gcc 源码官网下载
- Linux目录处理命令
- C语言8.8总结
- 中软Java学习第八天笔记之队列和栈