UVA - 11624 Fire! 【BFS】
 
题意
有一个人 有一些火
人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延
求 人能不能跑出来 如果能 求最小时间
思路
有一个 坑点 火是 可能有 多处 的 样例中 只有一处
然后 先让 火 蔓延 再让人走
BFS
AC代码
#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>
#define CLR(a) memset(a, 0, sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;
const double PI = acos(-1);
const double E = exp(1);
const double eps = 1e-30;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + 5;
const int MOD = 1e9 + 7;
string G[maxn];
int Move[8][2]
{
    -1, 0,
     1, 0,
     0,-1,
     0, 1,
    -1, 1,
    -1,-1,
     1, 1,
     1,-1,
};
int n, m;
int ans;
bool ok(int x, int y)
{
    if (x < 0 || x >= n || y < 0 || y >= m || G[x][y] != '.' )
        return false;
    return true;
}
bool edge(int x, int y)
{
    if (x == 0 || x == n - 1 || y == 0 || y == m - 1)
        return true;
    return false;
}
struct Node
{
    int x, y, step;
}tmp;
queue <Node> fire, q;
void bfs()
{
    int len = fire.size();
    for (int i = 0; i < len; i++)
    {
        int x = fire.front().x;
        int y = fire.front().y;
        fire.pop();
        for (int j = 0; j < 4; j++)
        {
            tmp.x = x + Move[j][0];
            tmp.y = y + Move[j][1];
            if (ok(tmp.x, tmp.y))
            {
                G[tmp.x][tmp.y] = 'F';
                fire.push(tmp);
            }
        }
    }
    len = q.size();
    for (int i = 0; i < len; i++)
    {
        int x = q.front().x;
        int y = q.front().y;
        int step = q.front().step;
        q.pop();
        if (edge(x, y))
        {
            ans = step;
            return;
        }
        for (int j = 0; j < 4; j++)
        {
            tmp.x = x + Move[j][0];
            tmp.y = y + Move[j][1];
            if (ok(tmp.x, tmp.y))
            {
                tmp.step = step + 1;
                G[tmp.x][tmp.y] = '*';
                q.push(tmp);
            }
        }
    }
    if (q.size())
        bfs();
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        while (!fire.empty())
            fire.pop();
        while (!q.empty())
            q.pop();
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; i++)
        {
            cin >> G[i];
            for (int j = 0; j < m; j++)
            {
                if (G[i][j] == 'J')
                {
                    tmp.x = i;
                    tmp.y = j;
                    tmp.step = 0;
                    q.push(tmp);
                    G[i][j] = '.';
                }
                else if (G[i][j] == 'F')
                {
                    tmp.x = i;
                    tmp.y = j;
                    fire.push(tmp);
                }
            }
        }
        ans = -1;
        bfs();
        if (ans == -1)
            printf("IMPOSSIBLE\n");
        else
            printf("%d\n", ans + 1);
    }
}UVA - 11624 Fire! 【BFS】的更多相关文章
- uva 11624  Fire! 【 BFS 】
		按白书上说的,先用一次bfs,求出每个点起火的时间 再bfs一次求出是否能够走出迷宫 #include<cstdio> #include<cstring> #include&l ... 
- UVA 11624 - Fire!  图BFS
		看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ... 
- UVa 11624 Fire!(BFS)
		Fire! Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld & %llu Description Joe ... 
- (简单)  UVA  11624   Fire! ,BFS。
		Description Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ow ... 
- UVA - 11624 Fire! 双向BFS追击问题
		Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ... 
- UVA_11624 Fire! 【BFS】
		一.题面 略 二.题意分析 一个迷宫中,有一个人Joe和一个或多个起火点,起火点可以蔓延,人可以走动,都只能走4个方向,问人能走出去的最少步数,如果不能输出不可能.很多大佬说是两遍BFS,先一遍火,记 ... 
- BFS(两点搜索) UVA 11624 Fire!
		题目传送门 /* BFS:首先对火搜索,求出火蔓延到某点的时间,再对J搜索,如果走到的地方火已经烧到了就不入队,直到走出边界. */ /******************************** ... 
- UVa 11624 Fire!(着火了!)
		UVa 11624 - Fire!(着火了!) Time limit: 1.000 seconds Description - 题目描述 Joe works in a maze. Unfortunat ... 
- UVA 11624 Fire!【两点BFS】
		Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the m ... 
随机推荐
- dedecms中的模版不解析dede:global
			先安装dedecms,配置好各项内容,栏目,网站内容等. 最近在使用dedecms做后台开发一个手机网站的项目,前端设计都是用html5来设计.很多地方都需要使用dede:global标签来调取全局变 ... 
- EXCEL最大行数问题:org.apache.xmlbeans.impl.store.Saver$TextSaver.resize(Saver.java:1700)
			今天在使用POI导出数据时,出现如下错误: ES查询阅读推荐比: resList: start: 写入excel Exception in thread "main" java.l ... 
- oracle软件安装完毕之后,如何创建数据库
			oracle软件安装完毕之后,如何创建数据库 学习了:https://zhidao.baidu.com/question/1800966379896476147.html 使用了Database Co ... 
- srm 541
			资瓷点这里阅读该文章O_o 250 Solution 水题,最暴力的方法枚举就可以 Code #include <bits/stdc++.h> using namespace std; # ... 
- Java使用笔记之stream和sorted使用
			//对象类型stream排序List<User> users = new ArrayList<User>(){ { add(new User("a", &q ... 
- layui-概念-入门-总结
			layui教程:http://www.dosrun.com/layui/ 获得 Layui你可以在官网首页下载到 Layui 的最新版,也可以通过 GitHub得到Layui的开源包.目前只同步维护这 ... 
- Robot framework 引入 Selenium2Library 类库:
			在用robotframework-selenium2library做web自动化测试时候,首先要将Selenium2Library导入到Test Suite中,在导入Selenium2Library时 ... 
- versions 忽略 xcuserdata 目录
			1.打开versions,选中xcuserdata目录 2.菜单条.Action->ignore "..." 3.versions不再显示不同 
- CPU调度算法
			批处理系统中的调度算法: *需要考虑的因素: 1. 吞吐量 2. cpu利用率 3. 周转时间 4. 公平性* 1.先来先服务: FCFS: 优点:实现简单 缺点:可能造成周转时间长 2.最短作业优先 ... 
- 【Linux】OpenWRT的无线设置注意事项——从2.4G到5G,hwmode不简单
			硬件说明: 操作系统:OpenWRT 网卡:AR9220R52Hn 网卡驱动:ath9k OpenWRT在刷机完成之后,并不会自动开启无线功能,需要手动修改配置文件,然后重启网络服务.管理无线功能的配 ... 
