[bfs] fzu oj 2196 Escape

题意:

一个迷宫里面从开始走到终点的最短步数。

但是这个迷宫里面有许多的火山,会喷岩浆,岩浆每秒向四周蔓延,岩浆到过的点不能走,但是人的移动优先于岩浆。

意思就是,如果某一个时刻,岩浆和人同时到达,那么如果这个点是出口的话,这个点是可以走的。

思路:

首先bfs预处理所有的点火山蔓延到的最小时间,就是将所有火山压进队做bfs。

接着用人做一遍bfs,注意考虑上面的那个人的移动优先于岩浆。

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
using namespace std;
#define eps 1e-13
#define ll __int64
int time[1234][1234];
int used[1234][1234];
int n,m;
char mp[1234][1234];
int dis[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
    int x,y,t;
};
void bfs1()
{
    for(int i=0; i<n; i++) for(int j=0; j<m; j++) time[i][j]=-1;
    node cur,next;
    queue<node>q;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(mp[i][j]=='!')
            {
                cur.x=i;
                cur.y=j;
                cur.t=0;
                time[i][j]=0;
                q.push(cur);
            }
        }
    }
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        for(int i=0; i<4; i++)
        {
            next.x=cur.x+dis[i][0];
            next.y=cur.y+dis[i][1];
            next.t=cur.t+1;
            if(next.x<0 || next.y<0 || next.x>=n || next.y>=m || mp[next.x][next.y]=='#' || time[next.x][next.y]!=-1) continue;
            time[next.x][next.y]=next.t;
            q.push(next);
        }
    }
    return ;
}
int bfs2()
{
    for(int i=0; i<n; i++) for(int j=0; j<m; j++) used[i][j]=0;
    node cur,next;
    queue<node>q;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(mp[i][j]=='S')
            {
                cur.x=i;
                cur.y=j;
                cur.t=0;
                used[i][j]=1;
                q.push(cur);
            }
        }
    }
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
        for(int i=0; i<4; i++)
        {
            next.x=cur.x+dis[i][0];
            next.y=cur.y+dis[i][1];
            next.t=cur.t+1;
            if(next.x<0 || next.y<0 || next.x>=n || next.y>=m || mp[next.x][next.y]=='#' || used[next.x][next.y] || time[next.x][next.y]<next.t) continue;
            used[next.x][next.y]=1;
            if(mp[next.x][next.y]=='E') return 1;
            else if(next.t!=time[next.x][next.y]) q.push(next);
        }
    }
    return 0;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++) scanf("%s",mp[i]);
        bfs1();
        int ans=bfs2();
        puts(ans?"Yes":"No");
    }
    return 0;
}
时间: 2024-10-13 02:28:11

[bfs] fzu oj 2196 Escape的相关文章

FZU 2196 Escape(BFS预处理+BFS搜索)

Problem 2196 Escape Accept: 123    Submit: 678 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 小明进入地下迷宫寻找宝藏,找到宝藏后却发生地震,迷宫各处产生岩浆,小明急忙向出口处逃跑.如果丢下宝藏,小明就能迅速离开迷宫,但小明并不想轻易放弃自己的辛苦所得.所以他急忙联系当程序员的朋友你(当然是用手机联系),并告诉你他所面临的情况,希望你能告诉他是否能成功带着宝藏

FZU 2196 Escape (两次BFS)

[题目链接]:click here~~ [题目大意]: Description 小明进入地下迷宫寻找宝藏,找到宝藏后却发生地震,迷宫各处产生岩浆,小明急忙向出口处逃跑.如果丢下宝藏,小明就能迅速离开迷宫,但小明并不想轻易放弃自己的辛苦所得.所以他急忙联系当程序员的朋友你(当然是用手机联系),并告诉你他所面临的情况,希望你能告诉他是否能成功带着宝藏逃脱. Input 有多组测试数据. 每组测试数据第一行是一个整数T,代表接下去的例子数.(0<=T<=10) 接下来是T组例子. 每组例子第一行是两

[Swust OJ 1023]--Escape(带点其他状态的BFS)

解题思路:http://acm.swust.edu.cn/problem/1023/ Time limit(ms): 5000 Memory limit(kb): 65535 Description BH is in a maze,the maze is a matrix,he wants to escape! Input The input consists of multiple test cases. For each case,the first line contains 2 inte

【算法学习笔记】63. BFS SJTU OJ 1281 蹦蹦跳跳

典型的BFS,找到起点直接进行搜搜即可.要注意的就是层数的处理.坐标到id的转换.还有就是要尽早判断是否达到终点. 代码注释很详细,最后面两个函数是一开始写的 用抽取邻接矩阵+Dijkstra 来算的,很麻烦 头脑一热的结果.. #include <vector> #include <queue> #include <iostream> using namespace std; int map[31][31]={0}; int M,N,M1,M2; struct Poi

BFS [SWUST OJ 191] 迷宫逃离

迷宫逃离(0191) 描述 江鸟突然想到了一个迷宫逃离的游戏,话说有三个人被困于一个n*m的迷宫里,他们三人都可以向上.向下.向左.向右四个方向进行走动,当然他们所在的初始位置没有障碍物,同时只能走到没有障碍物的格子上,现在江鸟要问你最少需要去掉多少个格子的障碍物,可以使他们三人之间两两互相可达. 输入 输入包括多组测试数据,每组测试数据第一行为两个整数n和m(2<=n,m<=100),接下来n行,每行m个字符,其中:‘w’.‘W’.‘f’分别代表那三个人:‘.’代表没有障碍物的格子,‘#’代

FZU OJ 2140 Forever 0.5 (几何)

Problem 2140 Forever 0.5 Accept: 269    Submit: 934    Special Judge Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Given an integer N, your task is to judge whether there exist N points in the plane such that satisfy the follo

FZU OJ 2147 A-B Game (数学水题)

Problem 2147 A-B Game Accept: 827    Submit: 1940 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Fat brother and Maze are playing a kind of special (hentai) game by two integers A and B. First Fat brother write an integer A on

FZU OJ 2111 Min Number (贪心)

Problem 2111 Min Number Accept: 586    Submit: 1139 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Now you are given one non-negative integer n in 10-base notation, it will only contain digits ('0'-'9'). You are allowed to choo

FZU OJ 2110 Star (计算几何)

Problem 2110 Star Accept: 585    Submit: 1731 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Overpower often go to the playground with classmates. They play and chat on the playground. One day, there are a lot of stars in the s