hdu 1072bfs

hdu1072 Nightmare

 

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 6285    Accepted Submission(s): 3084

 

 

Problem Description

Ignatius had a nightmare last night. Hefound himself in a labyrinth with a time bomb on him. The labyrinth has anexit, Ignatius should get out of the labyrinth before the bomb explodes. Theinitial exploding time of the bomb is set to 6 minutes. To prevent the bombfrom exploding by shake, Ignatius had to move slowly, that is to move from onearea to the nearest area(that is, if Ignatius stands on (x,y) now, he couldonly on (x+1,y), (x-1,y), (x,y+1), or (x,y-1) in the next minute) takes him 1minute. Some area in the labyrinth contains a Bomb-Reset-Equipment. They couldreset the exploding time to 6 minutes.

 

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

 

Here are some rules:

1. We can assume the labyrinth is a 2array.

2. Each minute, Ignatius could only get toone of the nearest area, and he should not walk out of the border, of course hecould not walk on a wall, too.

3. If Ignatius get to the exit when theexploding time turns to 0, he can't get out of the labyrinth.

4. If Ignatius get to the area whichcontains Bomb-Rest-Equipment when the exploding time turns to 0, he can't usethe equipment to reset the bomb.

5. A Bomb-Reset-Equipment can be used asmany times as you wish, if it is needed, Ignatius can get to any areas in thelabyrinth as many times as you wish.

6. The time to reset the exploding time canbe ignore, in other words, if Ignatius get to an area which containBomb-Rest-Equipment, and the exploding time is larger than 0, the explodingtime would be reset to 6.

 

 

Input

The input contains several test cases. Thefirst line of the input is a single integer T which is the number of testcases. T test cases follow.

Each test case starts with two integers Nand M(1<=N,Mm=8) which indicate the size of the labyrinth. Then N linesfollow, each line contains M integers. The array indicates the layout of thelabyrinth.

There are five integers which indicate thedifferent type of area in the labyrinth:

0: The area is a wall, Ignatius should notwalk on it.

1: The area contains nothing, Ignatius canwalk on it.

2: Ignatius' start position, Ignatiusstarts his escape from this position.

3: The exit of the labyrinth, Ignatius'target position.

4: The area contains aBomb-Reset-Equipment, Ignatius can delay the exploding time by walking to theseareas.

 

 

Output

For each test case, if Ignatius can get outof the labyrinth, you should output the minimum time he needs, else you shouldjust 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

 

 

Author

Ignatius.L

题解:

这道题是一道bfs的题目,比较坑的地方是要到达3和4的时候时间不能为0(被坑多次)。到达4的时候时间设置为6,任何点可以重复到达。最先到达3的一定是时间最小的,所以可以结束bfs了。

源代码:

#include <iostream>

#include <string.h>

#include <queue>

using namespace std;

 

struct node

{

   int xv,yw;

}used[100][100];

int mp[100][100];

queue<node> q;

int n,m;

node s;

int dir[4][2] ={{0,1},{0,-1},{1,0},{-1,0}};

 

bool judge(int x,int y)

{

   if(x < 0||x > n||y < 0 || y > m)

       return false;

   if(mp[x][y] == 0)

       return false;

   return true;

}

 

void bfs()

{

   used[s.xv][s.yw].xv = 0;

   used[s.xv][s.yw].yw = 6;

   q.push(s);

   node tt,tp;

   while(!q.empty())

    {

       tp = q.front();

       q.pop();

       for(int i = 0;i < 4;i++)

       {

           tt.xv = tp.xv + dir[i][0];

           tt.yw = tp.yw + dir[i][1];

           if(!judge(tt.xv,tt.yw))

                continue;

           if(used[tp.xv][tp.yw].yw > 1 && mp[tt.xv][tt.yw] == 3)

           {

                used[tt.xv][tt.yw].xv =used[tp.xv][tp.yw].xv + 1;

                return;

           }

           if(mp[tt.xv][tt.yw] == 4)

           {

                if(used[tp.xv][tp.yw].yw > 1&& used[tt.xv][tt.yw].xv > used[tp.xv][tp.yw].xv+1)

                {             

                    used[tt.xv][tt.yw].xv =used[tp.xv][tp.yw].xv + 1;

                    used[tt.xv][tt.yw].yw = 6;

                    q.push(tt);

                }

               

           }

           else

                if(used[tt.xv][tt.yw].yw <used[tp.xv][tp.yw].yw-1 && used[tp.xv][tp.yw].yw > 1)

                {

                    q.push(tt);

                    used[tt.xv][tt.yw].xv =used[tp.xv][tp.yw].xv + 1;

                    used[tt.xv][tt.yw].yw =used[tp.xv][tp.yw].yw - 1;

                }

       }

    }

}

int main()

{

   int t;

   cin >>t;

   for(int l = 0;l < t;l++)

    {

       cin >> n >>m;

       node ans;

       for(int i = 0;i < n;i++)

       {

           for(int k = 0;k < m;k++)

           {

                cin >> mp[i][k];

                used[i][k].xv = 999999;

                used[i][k].yw = -1;

                if(mp[i][k] == 3)

                {

                    ans.xv = i;

                    ans.yw = k;

                }

                else if(mp[i][k] == 2)

                {

                    s.xv = i;

                    s.yw = k;

                }

           }

       }

       bfs();

       if(used[ans.xv][ans.yw].xv == 999999)

           printf("-1\n");

       else

           printf("%d\n",used[ans.xv][ans.yw].xv);

    }

   return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值