题目大意:
这是一个放火逃生的游戏,就是给出来一个迷宫,迷宫里面有人‘J’和火焰‘F’当然这些火焰可能不止一处,然后问这个人最快从迷宫里面逃出来需要多久
////////////////////////////////////////////////////////////
最简单明了的办法就是写两个BFS,这样很容易理解,好吧,那就这么办吧,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
试一下吧。
第一次提交wa,只想到了火焰可能有多处,实际上还有可能没有火焰......
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std; #define maxn 1005
const int oo = 0xfffffff; struct node{int x, y;};
node JoeSite, FireSite[maxn*maxn];//因为火可能不止一处,所以开一个数组保存所有的火焰的位置
char G[maxn][maxn];
int vJoe[maxn][maxn], vFire[maxn][maxn];
int dir[][] = { {,},{,-},{,},{-,} };
int M, N, nFire; void BfsFire()
{
    node s, q;
    queue<node> Q;
    int i;     for(i=; i<nFire; i++)
    {
        Q.push(FireSite[i]);
        vFire[ FireSite[i].x ][ FireSite[i].y ] = ;
    }     while(Q.size())
    {
        s = Q.front();Q.pop();         for(i=; i<; i++)
        {
            q = s;
            q.x += dir[i][];
            q.y += dir[i][];             if(q.x>=&&q.x<M && q.y>=&&q.y<N && G[q.x][q.y]!='#' && vFire[q.x][q.y]==oo)
            {
                vFire[q.x][q.y] = vFire[s.x][s.y] + ;
                Q.push(q);
            }
        }
    }
} int IsBorder(int x, int y)//判断是否是边界并且是否比火焰先到达
{
    if( (x== || x==M- || y== || y==N-) && vJoe[x][y] < vFire[x][y] )
        return ;
    return ;
} int  BfsJoe()
{
    queue<node> Q;
    node s, q;
    int i;     vJoe[JoeSite.x][JoeSite.y] = ;
    Q.push(JoeSite);     while(Q.size())
    {
        s = Q.front();Q.pop();         if(IsBorder(s.x, s.y) == )
            return vJoe[s.x][s.y];         for(i=; i<; i++)
        {
            q = s;
            q.x += dir[i][];
            q.y += dir[i][];             if(q.x>=&&q.x<M && q.y>=&&q.y<N && G[q.x][q.y]!='#' && vJoe[q.x][q.y]==)
            {
                vJoe[q.x][q.y] = vJoe[s.x][s.y] + ;
                Q.push(q);
            }
        }
    }     return -;
} int  main()
{
    int T;     scanf("%d", &T);     while(T--)
    {
        int i, j, ans;         scanf("%d%d", &M, &N);         nFire = ;         for(i=; i<M; i++)
        {
            scanf("%s", G[i]);
            for(j=; j<N; j++)
            {
                vJoe[i][j] = ;
                vFire[i][j] = oo;                 if(G[i][j] == 'J')
                    JoeSite.x = i, JoeSite.y = j;
                if(G[i][j] == 'F')
                {
                    FireSite[nFire].x = i;
                    FireSite[nFire++].y = j;
                }
            }
        }         BfsFire();
        ans = BfsJoe();         if(ans == -)
            printf("IMPOSSIBLE\n");
        else
            printf("%d\n", ans);
    }     return ;

}

J - Fire!的更多相关文章

  1. UVA - 11624 J - Fire! (BFS)

    题目传送门 J - Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the ...

  2. J - Fire!---UVA 11624

    题目链接 题意:J代表Joe的位置,F代表火的起点,下一刻火将会向四周扩散,求Joe逃离的最短时间,如果不能逃离输出IMPOSSIBLE; 注意火的起点可能不止一处 可以用两次bfs分别求出人到达某个 ...

  3. Fire逃生

    Description: You are trapped in a building consisting of open spaces and walls. Some places are on f ...

  4. Fire! -两次dfs

    题目描述: Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of ...

  5. Fire! 又是图 bfs

    Joe works in a maze.  Unfortunately, portions of the maze havecaught on  re, and the owner of the ma ...

  6. UVA - 11624 Fire! 【BFS】

    题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...

  7. 【UVA - 11624】Fire!

    -->Fire! 直接上中文 Descriptions: 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块 ...

  8. kuangbin专题 专题一 简单搜索 Fire! UVA - 11624

    题目链接:https://vjudge.net/problem/UVA-11624 题意:一个迷宫,可能有一个或者多个地方着火了,每过1个时间消耗,火会向四周蔓延,问Joe能不能逃出迷宫,只要走出迷宫 ...

  9. UVA11624Fire!(BFS)

    题目链接 题意:帮助joe走出一个大火蔓延的迷宫,其中joe每分钟可往上下左右四个方向之一走,所有着火的格子都会蔓延(空格与着火格有公共边,下一分钟这个空格也会着火).迷宫中有一些障碍格,joe和火都 ...

随机推荐

  1. MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题

    在安装MySQL 5.6.30时,安装完成后,后台日志报如下警告信息:2016-05-27 12:25:27 7fabf86f7700 InnoDB: Error: Table "mysql ...

  2. Cocos_Code_Ide学习(一):理解Cocos Lua Project下的frameworks的proj.win32

    第一次写,不知道有没有用,有不对的地方,接受大家的批评.勿喷,谢谢. 1.首先,创建工程 ------------------------------------------------------- ...

  3. 获取IP城市

     新浪的接口 : http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 多地域测试方法:http://int.dpool.sina. ...

  4. access_token的获取方式

      获取Access Token $appid = ""; $appsecret = ""; $url = "https://api.weixin.q ...

  5. unix-环境高级编程-读书笔记与习题解答-第三篇

    第一章 第五节 进程与控制 该小节比较粗略的阐述了unix操作系统中用于进程控制的三个函数,分别为 : fork , exec, waitpid, 其中 exec 有五种变体, 这些变体实现的功能全部 ...

  6. WPF学习笔记-使用自定义资源字典(style)文件

    1.添加资源字典文件style.xmal 2.在资源字典中添加自定义style等 <ResourceDictionary xmlns="http://schemas.microsoft ...

  7. ThinkPHP 3.2 模板使用函数

    {$name|md5|strtoupper|substr=0,3} 编译后的结果是: <?php echo (substr(strtoupper(md5($name)),0,3));?> ...

  8. Mysql 授权访问

    ' WITH GRANT OPTION; FLUSH PRIVILEGES; 这就是设置一个 urser:root pwd: 账号,该账号可以在任何机器,同时访问服务器

  9. oracle积累继续

    选出当天的日期的数据 select * from test_table where to_char(datetime, 'yyyy-mm-dd')=to_char(sysdate,'yyyy-mm-d ...

  10. BZOJ 1492 货币兑换

    Description Input 第一行两个正整数\(N,S\),分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来\(N\)行,第\(K\)行三个实数\(A_{K},B_{K},Rate_{ ...