uva 11624 - Fire!

简介: 点击打开链接uva 11624 思路:bfs 分析: 1 题目要判断joe是否可以逃出迷宫,如果可以输出最小的时间,否则输出impossible 2 题目明确规定有且仅有一个Joe,但是火的个数是不确定的 3 那么如果没有火,我们只要去求Joe走出迷宫的时间即可。

点击打开链接uva 11624


思路:bfs
分析:
1 题目要判断joe是否可以逃出迷宫,如果可以输出最小的时间,否则输出impossible
2 题目明确规定有且仅有一个Joe,但是火的个数是不确定的
3 那么如果没有火,我们只要去求Joe走出迷宫的时间即可。但是如果有火的话这里将碰到火在蔓延并且人在走,但是对于火来说我们可以先预处理出每一个可以着火的点的着火时间,然后在利用bfs搜索只有当前这个结点的着火时间大于人到的时间我们才加入队列
4 所以我们只需要两次的bfs即可

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 1010;

struct Node{
    int x;
    int y;
    int t;
};
Node start;
char maze[MAXN][MAXN];
bool vis[MAXN][MAXN];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int timeState[MAXN][MAXN];
int n , m;
queue<Node>q;

bool ok(int x , int y){
    if(x >= 0 && x < n && y >= 0 && y < m)
        return true;
    return false;
}

//初始化并且预处理每个点的着火的时间
void init(){
    //找起始点    
    bool isFire = false;
    while(!q.empty())
        q.pop();
    memset(timeState , INF , sizeof(timeState));
    memset(vis , false , sizeof(vis));
    for(int i = 0 ; i < n ; i++){
       for(int j = 0 ; j < m ; j++){ 
          if(maze[i][j] == 'J'){ 
               start.x = i; 
               start.y = j;
               start.t = 0;
          }
          if(maze[i][j] == 'F'){
               isFire = true;
               vis[i][j] = true;
               timeState[i][j] = 0; 
               q.push((Node){i,j,0});
          }
       }
    }
    if(!isFire)
        return;
    //预处理出每一个点的着火的时间
    while(!q.empty()){
         Node tmp = q.front();
         q.pop();
         for(int i = 0 ; i < 4 ; i++){
             int tx = tmp.x + dir[i][0];
             int ty = tmp.y + dir[i][1];
             if(ok(tx , ty) && !vis[tx][ty] && maze[tx][ty] == '.'){
                vis[tx][ty] = true;
                timeState[tx][ty] = tmp.t+1;; 
                q.push((Node){tx , ty , tmp.t+1});
             }
         }
    }
}

int solve(){
    while(!q.empty())
        q.pop();
    q.push(start);
    memset(vis , false , sizeof(vis));
    vis[start.x][start.y] = true;
    //广搜
    while(!q.empty()){
         Node tmp = q.front();
         q.pop();
         //进行四个方向的遍历
         for(int i = 0 ; i < 4 ; i++){
             int tx = tmp.x + dir[i][0];
             int ty = tmp.y + dir[i][1];
             if(!ok(tx , ty))
                 return tmp.t+1;
             if(!vis[tx][ty] && maze[tx][ty] == '.' && tmp.t+1 < timeState[tx][ty]){
                 q.push((Node){tx , ty , tmp.t+1});
                 vis[tx][ty] = true;
             }
         }
    }
    return INF;
}

int main(){
    int Case;
    scanf("%d" , &Case);
    while(Case--){
        scanf("%d%d%*c" , &n , &m); 
        for(int i = 0 ; i < n ; i++)
            gets(maze[i]);
        init();
        int ans = solve();
        if(ans != INF)
           printf("%d\n" , ans);
        else
           puts("IMPOSSIBLE");
    }
    return 0;
}



目录
相关文章
UVa11565 - Simple Equations
UVa11565 - Simple Equations
52 0
UVA10474 大理石在哪儿 Where is the Marble?
UVA10474 大理石在哪儿 Where is the Marble?
UVA - 10474 Where is the Marble
Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers written on them.
1419 0
uva 1326 - Jurassic Remains
点击打开链接uva 1326 题意:给定n个由大写字母组成的字符串,选择尽量多的串使得每个大写字母都能出现偶数次 分析: 1 在一个字符串中每个字符出现的次数是无关的,重要的是只是这些次数的奇偶性。
925 0
uva 10795 A Different Task
点击打开链接uva 10795 思路:递归 分析:(转载网友,写的不错) 点击打开链接 1  新汉诺塔:标准的汉诺塔上有n个大小各异的盘子。
839 0
|
资源调度
uva674Coin Change
题意:手中的硬币币值有1,5,10,25,50共5种,给定一个面值n,问把n兑换成硬币的方案总数是多少。 分析:先打表,再输入输出。动态规划的简单题目,设dp[i]表示面值为i的情况下能兑换的种类,那么dp[i]=sigma(dp[i-v[j]]), j=0..4, v[j]={1,5,10,25,50};也就是,如果i大于v[j],说明能够用dp[i-v[j]]的方案再加上一枚面值为v[j]的硬币作为面值i的方案,不过这只是方案中硬币的数量多了一枚,题目中只是问方案数量,那么此时两者在方案数量上等价,那么方案总数上加上这一种情况就可以了。
729 0