UVA 11624 Fire!

数据:

3
4 4
####
#JF#
#..#
#..#
3 3
FFF
FJF
FFF
3 3
...
.J.
...

嗯,被第三个数据卡啦半天....

两次BFS  预处理一下每个点最早着火的时间.

/* ***********************************************
Author        :pk29
Created Time  :2015/8/19 19:26:13
File Name     :4.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 10000+10
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
struct node{
    int x,y,dist;
};
bool cmp(int a,int b){
    return a>b;
}
int dir[4][2]={1,0,0,1,0,-1,-1,0};
char mp[1100][1100];
int vis[1100][1100],val[1100][1100];
int n,m,sx,sy,fx,fy;
queue<node>p;
void bfs1(){
    cle(vis);
    node u,v;
    while(!p.empty()){
        u=p.front(),p.pop();
        for(int i=0;i<4;i++){
            int nx=u.x+dir[i][0];
            int ny=u.y+dir[i][1];
            if(!vis[nx][ny]&&nx<=n&&ny>=1&&nx>=1&&ny<=m&&mp[nx][ny]==‘.‘){
                v.x=nx,v.y=ny,v.dist=u.dist+1;
                vis[nx][ny]=1;
                val[nx][ny]=v.dist;
                p.push(v);
            }
        }
    }
}
queue<node>q;
void bfs2(){
    int mark=0;
    cle(vis);
    while(!q.empty())q.pop();
    node u,v;
    u.x=sx,u.y=sy,u.dist=0;
    q.push(u);
    vis[u.x][u.y]=1;
    while(!q.empty()){
        u=q.front(),q.pop();
        if(u.x==n||u.x==1||u.y==1||u.y==m){
            mark=1;printf("%d\n",u.dist+1);break;
        }
        for(int i=0;i<4;i++){
            int nx=u.x+dir[i][0];
            int ny=u.y+dir[i][1];
            if(vis[nx][ny]==0&&nx<=n&&ny>=1&&nx>=1&&ny<=m&&mp[nx][ny]==‘.‘){
                v.dist=u.dist+1;
                if(v.dist<val[nx][ny]){
                    v.x=nx,v.y=ny;
                    q.push(v);
                    vis[nx][ny]=1;
                }
            }
        }
    }
    if(!mark)printf("IMPOSSIBLE\n");
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    //freopen("out.txt","w",stdout);
    int t;
    cin>>t;
    while(t--){
        cin>>n>>m;
        cle(mp);
        memset(val,INF,sizeof val);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                cin>>mp[i][j];
                if(mp[i][j]==‘J‘){
                    sx=i,sy=j;
                }
                if(mp[i][j]==‘F‘){
                    node o;o.x=i,o.y=j,o.dist=0;
                     p.push(o);
                }
            }
        bfs1();
        bfs2();
    }
    return 0;
}
时间: 2024-10-19 07:57:40

UVA 11624 Fire!的相关文章

uva 11624 Fire!(多源BFS)

uva 11624 Fire! 题目大意:J在迷宫里工作,有一天迷宫起火了,火源有多处.每过一秒,火源都会向四个方向蔓延,J也会向四个方向移动,问J能不能跑出去,能的话输出他跑出去的最短时间,否则输出"IMPOSSIBLE" 解题思路:先进行一次BFS,找出每一点火焰蔓延到该处的最短时间.然后根据这张"火势图",对J的行进路线进行BFS.注意J在边缘的时候,以及没有火源的时候. #include <cstdio> #include <cstring

UVa 11624 Fire!(着火了!)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5000pt } h3 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 1

BFS(两点搜索) UVA 11624 Fire!

题目传送门 1 /* 2 BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. 3 */ 4 /************************************************ 5 Author :Running_Time 6 Created Time :2015-8-4 8:11:54 7 File Name :UVA_11624.cpp 8 ****************************************

UVA 11624 - Fire!(BFS)

UVA 11624 - Fire! 题目链接 题意:一个迷宫,一些格子着火了,火每秒向周围蔓延,现在J在一个位置,问他能走出迷宫的最小距离 思路:BFS2次,第一次预处理每个位置着火时间,第二次根据这个再BFS一次 代码: #include <cstdio> #include <cstring> #include <queue> using namespace std; const int d[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; co

UVa 11624 Fire!(BFS 逃离火灾)

题意   n*m的迷宫中有一些着火点  每个着火点上下左右相邻的非墙点下一秒也将成为一个着火点  Joe每秒能向相邻的点移动一步  给你所有着火点的位置和Joe的位置  问Joe逃离这个迷宫所需的最小时间 可以先一遍bfs把每个点的最早着火时间存起来   只有Joe到达该点的时间小于这个时间Joe才能走这个点   只需要对Joe所在的点为起点再来一次bfs就行了   需要注意的是开始可能有多个着火点  我开始以为只有一个着火点被坑了好久 v[i][j]第一遍bfs记录点i,j的最早着火时间  第

(简单) UVA 11624 Fire! ,BFS。

Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a fire escape plan. Help Joe escape the maze. Given Joe's location in the maze and which squares of the maze are o

UVA - 11624 - Fire! (BFS的应用)

A - Fire! Time Limit:1000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatus Description Problem B: Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire,and the owner of the maze neglected to create a fire

uva 11624 Fire!(BFS)

Fire! Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem B: Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a f

UVA 11624 Fire!(广度优先搜索)

题目大意:在一个N*M的迷宫内,J代表某人(只有一个),F代表火(可能不只一个),#代表墙,火每分钟会向四周除了墙以外的地方扩散一层,问人能否在没被火烧到 之前逃出迷宫,若能逃出输出最短时间.很明显的bfs.但由于火到达的地方人不能抵达,故需先对火进行bfs,标记后若人在火烧到之前抵达即可.最后逃出时间需要加一, 因为当时只是抵达边界,若逃出时间需加一. #include <stdio.h> #include <queue> #include <string.h> #i

BFS [uva 11624] Fire!

J - Fire! Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Problem B: Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a fire escape plan. Help Joe