(已解决)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;}


原创粉丝点击