【HDOJ】「1072」BFS

原题出处

Problem Description

Ignatius had a nightmare last night. He found himself in a labyrinth
with a time bomb on him. The labyrinth has an exit, Ignatius should
get out of the labyrinth before the bomb explodes. The initial
exploding time of the bomb is set to 6 minutes. To prevent the bomb
from exploding by shake, Ignatius had to move slowly, that is to move
from one area to the nearest area(that is, if Ignatius stands on (x,y)
now, he could only on (x+1,y), (x-1,y), (x,y+1), or (x,y-1) in the
next minute) takes him 1 minute. Some area in the labyrinth contains a
Bomb-Reset-Equipment. They could reset the exploding time to 6
minutes.

Given the layout of the labyrinth and Ignatius’ start position, please
tell Ignatius whether he could get out of the labyrinth, if he could,
output the minimum time that he has to use to find the exit of the
labyrinth, else output -1.

Here are some rules:

  1. We can assume the labyrinth is a 2 array.
  2. Each minute, Ignatius could only get to one of the nearest area, and he should not walk out of the border, of course he could not walk
    on a wall, too.
  3. If Ignatius get to the exit when the exploding time turns to 0, he can’t get out of the labyrinth.
  4. If Ignatius get to the area which contains Bomb-Rest-Equipment when the exploding time turns to 0, he can’t use the equipment to reset the
    bomb.
  5. A Bomb-Reset-Equipment can be used as many times as you wish, if it is needed, Ignatius can get to any areas in the labyrinth as many
    times as you wish.
  6. The time to reset the exploding time can be ignore, in other words, if Ignatius get to an area which contain Bomb-Rest-Equipment, and the
    exploding time is larger than 0, the exploding time would be reset to

Input

The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case starts with two integers N and M(1<=N,Mm=8) which indicate the size of the labyrinth. Then N lines follow, each line contains M integers. The array indicates the layout of the labyrinth.
There are five integers which indicate the different type of area in the labyrinth:
0: The area is a wall, Ignatius should not walk on it.
1: The area contains nothing, Ignatius can walk on it.
2: Ignatius’ start position, Ignatius starts his escape from this position.
3: The exit of the labyrinth, Ignatius’ target position.
4: The area contains a Bomb-Reset-Equipment, Ignatius can delay the exploding time by walking to these areas.

Output

For each test case, if Ignatius can get out of the labyrinth, you should output the minimum time he needs, else you should just output -1.

Sample Input

3
3 3
2 1 1
1 1 0
1 1 3
4 8
2 1 1 0 1 1 1 0
1 0 4 1 1 0 4 1
1 0 0 0 0 0 0 1
1 1 1 4 1 1 1 3
5 8
1 2 1 1 1 1 1 4
1 0 0 0 1 0 0 1
1 4 1 0 1 1 0 1
1 0 0 0 0 3 0 1
1 1 4 1 1 1 1 1

Sample Output

4
-1
13

【题目大意】
炸弹爆炸时间是6个分钟,在6分钟内必须从2走到3,且不能刚好6分钟到达出口,0不能通过,1、4可以通过,且走到4后可以自动重置炸弹时间。若能逃出则输出最短所需步数、反之则输出-1。
【过程要求】不上墙不越界时间够。

【做题反思】

  1. BFS用到的queue ,以及一前一后(cur、next)的应用以及对bfs算法思想的体现(表示串联关系的cur和next以及并联关系的next1和next2)。
  2. 对于queue中的元素所需携带的信息(所设代表每一步的结构体需要包含哪些信息)
  3. bfs函数中判断成功与否的终止条件->返回值的设置
  4. 全局变量设置注意
  5. 注意初始化问题

AC代码

#include
#include
#include
#include
#include
#include
#include
#define len (int)strlen(s)
#define max(a,b) (a)>(b)>(a):(b)
#define min(a,b) (a)<(b)>(a):(b)
using namespace std;

int direct[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{
    int x,y;
    int time;
    int step;
};
int sx,sy,ex,ey;
int n,m;
int state[10][10]={},time_map[10][10]={};

int bfs(int sx,int sy){
    queueque;
    node s;
    s.x=sx;s.y=sy;
    s.step=0;s.time=6;
    time_map[sx][sy]=6;
    que.push(s);
    while(!que.empty()){
        node cur=que.front();
        que.pop();
        if(cur.x==ex&&cur.y==ey)
            return cur.step;
        if(cur.time==1) continue;
        for(int i=0;i<4;i++){
            node next;
            next.x=cur.x+direct[i][0];next.y=cur.y+direct[i][1];
            next.time=cur.time-1;next.step=cur.step+1;
            if(next.x>=1&&next.x<=n&&next.y>=1&&next.y<=m&&state[next.x][next.y]!=0){
                if(state[next.x][next.y]==4)
                    next.time=6;
                if(next.time>time_map[next.x][next.y]){
                    que.push(next);
                    time_map[next.x][next.y]=next.time;
                }
            }
        }
    }
    return -1;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                scanf("%d",&state[i][j]);
                time_map[i][j]=0;               //初始化注意
                if(state[i][j]==2) {sx=i;sy=j;}
                if(state[i][j]==3) {ex=i;ey=j;}
            }
        printf("%d\n",bfs(sx,sy));
    }
}

你可能感兴趣的:(HDOJ,HDU寒假集训)