J - Fire!

题目大意:

这是一个放火逃生的游戏,就是给出来一个迷宫,迷宫里面有人‘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[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int M, N, nFire;

void BfsFire()
{
    node s, q;
    queue<node> Q;
    int i;

for(i=0; i<nFire; i++)
    {
        Q.push(FireSite[i]);
        vFire[ FireSite[i].x ][ FireSite[i].y ] = 1;
    }

while(Q.size())
    {
        s = Q.front();Q.pop();

for(i=0; i<4; i++)
        {
            q = s;
            q.x += dir[i][0];
            q.y += dir[i][1];

if(q.x>=0&&q.x<M && q.y>=0&&q.y<N && G[q.x][q.y]!=‘#‘ && vFire[q.x][q.y]==oo)
            {
                vFire[q.x][q.y] = vFire[s.x][s.y] + 1;
                Q.push(q);
            }
        }
    }
}

int IsBorder(int x, int y)//判断是否是边界并且是否比火焰先到达
{
    if( (x==0 || x==M-1 || y==0 || y==N-1) && vJoe[x][y] < vFire[x][y] )
        return 1;
    return 0;
}

int  BfsJoe()
{
    queue<node> Q;
    node s, q;
    int i;

vJoe[JoeSite.x][JoeSite.y] = 1;
    Q.push(JoeSite);

while(Q.size())
    {
        s = Q.front();Q.pop();

if(IsBorder(s.x, s.y) == 1)
            return vJoe[s.x][s.y];

for(i=0; i<4; i++)
        {
            q = s;
            q.x += dir[i][0];
            q.y += dir[i][1];

if(q.x>=0&&q.x<M && q.y>=0&&q.y<N && G[q.x][q.y]!=‘#‘ && vJoe[q.x][q.y]==0)
            {
                vJoe[q.x][q.y] = vJoe[s.x][s.y] + 1;
                Q.push(q);
            }
        }
    }

return -1;
}

int  main()
{
    int T;

scanf("%d", &T);

while(T--)
    {
        int i, j, ans;

scanf("%d%d", &M, &N);

nFire = 0;

for(i=0; i<M; i++)
        {
            scanf("%s", G[i]);
            for(j=0; j<N; j++)
            {
                vJoe[i][j] = 0;
                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 == -1)
            printf("IMPOSSIBLE\n");
        else
            printf("%d\n", ans);
    }

return 0;

}

时间: 2024-12-15 03:07:46

J - Fire!的相关文章

J - Fire!---UVA 11624

题目链接 题意:J代表Joe的位置,F代表火的起点,下一刻火将会向四周扩散,求Joe逃离的最短时间,如果不能逃离输出IMPOSSIBLE; 注意火的起点可能不止一处 可以用两次bfs分别求出人到达某个位置所用时间和火到达某个位置所用时间 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #define INF 0xfffffff 5 #include<queue> 6 #inclu

Fire! 又是图 bfs

Joe works in a maze.  Unfortunately, portions of the maze havecaught on  re, and the owner of the maze neglected to create a  reescape plan. Help Joe escape the maze.Given Joe's location in the maze and which squares of the mazeare on  re, you must d

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

[kuangbin带你飞]专题一 简单搜索

一直拖.放了放久.受不了 A - 棋盘问题 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第

js控制TR的显示影藏

在很多现实的场景中,有的文本框我们希望在选择“是”的按钮之后才出现,这就需要js控制TR的隐藏和显示,(div的影藏显示类似) 以下是一段选择是的按钮就显示身高和体重的文本框的代码.注意:ready方法必须要引用jquery的库. 1.html Code <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <

HDU 1158 Employment Planning【DP】

题意:给出n个月,雇佣一个人所需的钱hire,一个人工作一个月所需要的钱salary,解雇一个人所需要的钱fire,再给出这n个月每月1至少有num[i]个人完成工作,问完成整个工作所花费的最少的钱是多少. 用dp[i][j]表示在第i个月雇佣j个人所需要的最少花费 先考虑只解雇人和聘请人的情况 1 for(j=num[i];j<=sum;j++) 2 { 3 if(j>num[i-1])//说明雇佣了人 4 dp[i][j]=dp[i-1][num[i-1]]+j*salary+(j-num

MVC--数据增删改查(Razro语法)

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Mvc2.Models; namespace Mvc2.Controllers { public class HomeController : Controller { public ActionResult Index() { return View(); } //添加

原版本的jquery 开发过程中发现jquery好像更新了

/*! jQuery v1.7.1 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css(&

2008 SCI 影响因子(Impact Factor)

Excel download 期刊名缩写 影响因子 ISSN号 CA-CANCER J CLIN 74.575 0007-9235 NEW ENGL J MED 50.017 0028-4793 ANNU REV IMMUNOL 41.059 0732-0582 NAT REV MOL CELL BIO 35.423 1471-0072 PHYSIOL REV 35.000 0031-9333 REV MOD PHYS 33.985 0034-6861 JAMA-J AM MED ASSOC 3