(已解决)UVA11642 Fire!(两次BFS~)
来源:互联网 发布:阿里云轻应用服务器 编辑:程序博客网 时间:2024/06/01 07:19
最开始使用了一种很无脑的解法,虽然数据可以,但是TLE了,然后就用了两个队列,先一次广搜确定每个位置着火时间,再对john位置进行广搜。。。
但是提交还是WA啊,WA原因目前还不能用肉眼发现。我很怨念,只想快点怼完这些题还不让过。明天再看看别人的代码好了,先留下我自己的。。
--------------------------------------------------------------------
看了别人的码以后就发现错误了,Fire应在每次初始化的时候设置为INF。
#include <cstdio>#include <cstring>#include <iostream>#include <queue>#include <vector>#define INF 0x3f3f3f3f#define MAX 1005using namespace std;typedef struct { int x, y, cnt; } fire;typedef struct { int x, y, cnt; } per;char map[MAX][MAX];int Vis[MAX][MAX];int Visf[MAX][MAX];int Wall[MAX][MAX];int Fire[MAX][MAX];queue<fire> FireQ;queue<per> PerQ;int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};int n, m;void FBFS() { memset(Visf, 0, sizeof(Visf)); while (!FireQ.empty()) { fire f = FireQ.front(); FireQ.pop(); Visf[f.x][f.y] = 1; for (int i = 0; i < 4; i++) { int fx = f.x + dx[i]; int fy = f.y + dy[i]; if (!Wall[fx][fy] && !Visf[fx][fy] && fx >= 1 && fx <= n && fy >= 1 && fy <= m) { Fire[fx][fy] = f.cnt + 1; Visf[fx][fy] = 1; FireQ.push((fire){fx, fy, f.cnt + 1}); } } }}int BFS(int a, int b) { FBFS(); while (!PerQ.empty()) PerQ.pop(); per front; front.x = a; front.y = b; front.cnt = 0; Vis[a][b] = 1; PerQ.push(front); while (!PerQ.empty()) { per front = PerQ.front(); PerQ.pop(); if (front.x >= n || front.y >= m || front.x <= 1 || front.y <= 1) return front.cnt + 1; for (int i = 0; i < 4; i++) { per temp; int px = front.x + dx[i]; int py = front.y + dy[i]; temp.x = px; temp.y = py; temp.cnt = front.cnt + 1; if (temp.cnt < Fire[px][py] && !Vis[px][py] && !Wall[px][py]) { Vis[px][py] = 1; PerQ.push(temp); } } } return INF;}int main(void) { int t; int ans; int a, b; int ch; scanf("%d", &t); while (t--) { memset(Vis, 0, sizeof(Vis)); memset(Wall, 0, sizeof(Wall)); memset(Fire, INF, sizeof(Fire)); ans = INF; while (!FireQ.empty()) FireQ.pop(); scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { ch = getchar(); for (int j = 1; j <= m; j++) { scanf("%c", &map[i][j]); if (map[i][j] == 'J') { a = i; b = j; } if (map[i][j] == '#') Wall[i][j] = 1; if (map[i][j] == 'F') { FireQ.push((fire){i, j, 0}); Fire[i][j] = 1; } } } ans = min(ans, BFS(a, b)); if (ans == INF) { printf("IMPOSSIBLE\n"); } else printf("%d\n", ans); } return 0;}
阅读全文
0 0
- (已解决)UVA11642 Fire!(两次BFS~)
- uva11264-Fire!(两次bfs)
- UVA 11624 Fire!(两次bfs)
- uva 11624 Fire!(bfs两次)
- UVA11624 Fire! 两次BFS(J)
- UVA11624-Fire!(两次bfs)
- UVA11624 Fire 两次BFS
- fire!--两次bfs
- UVA-11624 Fire!(两次BFS)
- UVA 11624 Fire!(两次BFS、超级源)
- UVA - 11624 Fire!(两次BFS 两种解法)
- uva 11624 大火蔓延的迷宫 Fire!(两次bfs)
- UVA 11624 Fire! 两次BFS求解
- UVA11624 Fire! 两次BFS 读懂题意很重要
- Fire Game(BFS)
- Fire Game (BFS)
- Fire!(bfs) UVA
- UVa11624-Fire!(bfs)
- leetcode Combinations
- 20171031|课堂作业01 业务类抽象
- 递归
- 15.32
- Latex中文处理
- (已解决)UVA11642 Fire!(两次BFS~)
- awk中next用法
- Cortex-M/R/A 芯片&内核&架构
- 我的电路实践
- 解释参数在方法中的传递过程
- 并查集详解
- Python web后端开发框架 Django 、Flask、Tornado
- windows 10 下安装解压版的MySql数据库
- 基于线性回归与核函数——linear function & basis function 的代码,处理马拉松数据