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;
}