当前位置: 代码迷 >> 综合 >> UVA - 11624 Fire! (kuangbin - 简单搜索)
  详细解决方案

UVA - 11624 Fire! (kuangbin - 简单搜索)

热度:2   发布时间:2024-02-23 18:30:28.0

题目描述(已转换成中文)

??乔在迷宫中工作。不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划。请帮助乔逃离迷宫。根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必须确定火焰烧到他之前,乔是否可以离开迷宫,如果能离开他能跑多快。
??乔和火每分钟移动一个方格,上、下、左、右,四个方向中的一个。火势向四个方向同时蔓延。乔可以从迷宫的任何一个边界逃离迷宫。无论是乔还是火都不会到达有墙的位置。

输入格式

??第一行输入包含一个整数,即测试次数,每个测试用例的第一行包含两个整数R和C,用空格分隔,1≤R,C≤1000
??下面R行中,每一行都包含C个字符,以及每个字符是以下之一:
??# 代表墙
??. 代表空地,火和乔是可通行的
??J 乔在迷宫中最初的位置,火和乔是可通行的
??F 代表火
??在每组测试中只有一个J

输出格式

??对于每个测试用例,如果在火蔓延的时候烧到了乔,则乔无法逃出迷宫,输出’IMPOSSIBLE’如果乔能逃出迷宫,则输出乔最快可以在几分钟内安全逃出迷宫,每组输出占一行

输入输出样例

输入

2
4 4

#JF#
#…#
#…#
3 3

#J.
#.F

输出

3
IMPOSSIBLE

题目链接

分析:

??

这道题需要注意的地方:

??

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int r, c, i, j, p, q, p1, q1;
char a[1005][1005];
int vis1[1005][1005], vis2[1005][1005];
int b[4][2] = {
    {
    0, 1}, {
    0, -1}, {
    1, 0}, {
    -1, 0}};
struct node{
    int x, y;
};
int read(){
    int x, f = 1;char ch;while(ch = getchar(), ch < '0' || ch > '9') if(ch == '-') f = -1;x = ch - '0';while(ch = getchar(), ch >= '0' && ch <= '9') x = x * 10 + ch - 48;return x * f;
}
void bfs1(){
    node n, m;queue <node> s;memset(vis1, -1, sizeof(vis1));for(i = 0; i < r; i++){
    for(j = 0; j < c; j++){
    if(a[i][j] == 'F'){
    n.x = i;n.y = j;s.push(n);vis1[n.x][n.y] = 0;}}}while(!s.empty()){
    n = s.front();s.pop();for(i = 0; i < 4; i++){
    p = n.x + b[i][0];q = n.y + b[i][1];if(p < 0 || p >= r || q < 0 || q >= c || vis1[p][q] != -1 || a[p][q] == '#') continue;vis1[p][q] = vis1[n.x][n.y] + 1;m.x = p;m.y = q;s.push(m);}}
}
int bfs2(int x, int y){
    memset(vis2, -1, sizeof(vis2));node n, m;queue <node> s;n.x = x;n.y = y;vis2[n.x][n.y] = 0;s.push(n);while(!s.empty()){
    n = s.front();s.pop();if(n.x == 0 || n.y == 0 || n.x == r - 1 || n.y == c - 1) return vis2[n.x][n.y] + 1; for(i = 0; i < 4; i++){
    p = n.x + b[i][0];q = n.y + b[i][1];if(vis2[p][q] != -1 || p < 0 || p >= r || q < 0 || q >= c || a[p][q] == '#' || (vis2[n.x][n.y] + 1 >= vis1[p][q] && vis1[p][q] != -1)) continue;vis2[p][q] = vis2[n.x][n.y] + 1;m.x = p;m.y = q;s.push(m);}}return -1;
}
int main(){
    int ans, t = read();while(t--){
    r = read();c = read();for(i = 0; i < r; i++){
    for(j = 0; j < c; j++){
    scanf("%c", &a[i][j]);if(a[i][j] == 'J'){
    p1 = i;q1 = j;}}getchar();}bfs1();ans = bfs2(p1, q1);		if(ans == -1) printf("IMPOSSIBLE\n");else printf("%d\n", ans);}return 0;
}