Nightmare
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10024 Accepted Submission(s): 4885
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 6.
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 6.
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.
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题目大意:0是不能走的地方,1代表能走的地方,2代表他的起点,3代表终点,4代表可以重置炸弹爆炸时间的地方。求逃出去所用的最小时间,如果逃不出去,就输出-1.解题思路:不能单纯的标记,vis数组存的是到当前位置距离炸弹爆炸所剩的时间。如果我再次走到这个位置,这个位置已经访问过了,说明有比我当前更快的道路到达这里,如果我再次到达这里距离炸弹所剩的时间比上次的大,则这条路可能是解,我让它进队,但是如果我再次到达这里距离炸弹爆炸所剩的时间还没有先前的大,我走这条路耗时还长,那这种情况就可以直接放弃,因为不会比上次到达这个地方的路径更优。这条路可以直接放弃了,因为不可能是解。题目代码:#include <iostream> #include <stdio.h> #include <queue> #include <string.h> using namespace std; ///四个搜索方向上右下左 int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; int N,M; ///N行M列得矩阵。 int Map[10][10]; int vis[10][10]; int sx,sy,ex,ey; struct Node { int x,y; int time,step; }; int bfs() { Node cur,nex; memset(vis,0,sizeof(vis)); queue<Node>qu; cur.x = sx; cur.y = sy; cur.step = 0; cur.time = 6; qu.push(cur); while(!qu.empty()) { cur = qu.front(); qu.pop(); if(cur.x == ex && cur.y == ey) return cur.step; for(int i = 0; i < 4; i++) { nex.x = cur.x + dir[i][0]; nex.y = cur.y + dir[i][1]; nex.time = cur.time - 1; nex.step = cur.step + 1; if(nex.x>0 && nex.x<=N && nex.y>0 && nex.y<=M && nex.time>0 && Map[nex.x][nex.y]!=0) { if(Map[nex.x][nex.y] == 4) nex.time = 6; if(nex.time > vis[nex.x][nex.y]) { vis[nex.x][nex.y] = nex.time; qu.push(nex); } } } } 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",&Map[i][j]); if(Map[i][j] == 2) { sx = i; sy = j; } if(Map[i][j] == 3) { ex = i; ey = j; } } int ans = bfs(); printf("%d\n",ans); } return 0; }