HDU-1242 Rescue

来源:互联网 发布:fc2免费破解版域名 编辑:程序博客网 时间:2024/05/22 06:32

Rescue

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


Problem Description
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.

Angel's friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.

You have to calculate the minimal time to approach Angel. (We can move only UP, DOWN, LEFT and RIGHT, to the neighbor grid within bound, of course.)
 

Input
First line contains two integers stand for N and M.

Then N lines follows, every line has M characters. "." stands for road, "a" stands for Angel, and "r" stands for each of Angel's friend.

Process to the end of the file.
 

Output
For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing "Poor ANGEL has to stay in the prison all his life."
 

Sample Input
7 8#.#####.#.a#..r.#..#x.....#..#.##...##...#..............
Sample Output
13

 ————————————————————集训1.2的分割线————————————————————

思路:复习BFS。这道题不一样的是每个点消耗的时间不一样。要求最短时间到达终点。需要开一个新的数组min_time[][]记录走到每个点的最短时间。(隐约感到记忆化搜索也可以写吧)队列的元素可以采用结构体储存位置和走到该点最短时间。每次入队的都是产生更优解的点。

代码如下:

/*ID: j.sure.1PROG: LANG: C++*//****************************************/#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <stack>#include <queue>#include <vector>#include <map>#include <string>#include <iostream>using namespace std;/****************************************/#define LIM nx >= 0 && nx < n && ny >= 0 && ny < mconst int N = 205;const int d[][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};char mat[N][N];int min_t[N][N];int n, m, ex, ey;struct Node{int x, y;int time;};queue <Node> q;int bfs(Node &st){q.push(st);Node tmp;while(!q.empty()) {tmp = q.front(); q.pop();for(int i = 0; i < 4; i++) {int nx = tmp.x + d[i][0], ny = tmp.y + d[i][1];if(LIM && mat[nx][ny] != '#') {Node nt;nt.x = nx; nt.y = ny;nt.time = tmp.time + 1;if(mat[nx][ny] == 'x') nt.time++;if(nt.time < min_t[nx][ny]) {min_t[nx][ny] = nt.time;q.push(nt);}}}}return min_t[ex][ey];}int main(){#ifndef ONLINE_JUDGEfreopen("1242.in", "r", stdin);freopen("1242.out", "w", stdout);#endifwhile(~scanf("%d%d", &n, &m)) {getchar();Node st;for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {scanf("%c", &mat[i][j]);min_t[i][j] = 2e9;switch(mat[i][j]){case 'r': st.x = i; st.y = j; min_t[i][j] = st.time = 0; break;case 'a': ex = i; ey = j; break;}}getchar();}int ans = bfs(st);if(ans == 2e9)puts("Poor ANGEL has to stay in the prison all his life.");elseprintf("%d\n", ans);}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 智能门锁没电了怎么办 十字锁钥匙丢了怎么办 罐头的拉环断了怎么办 锁坏了 打不开了怎么办 门锁锁不起来了怎么办 卧室门锁舌断了怎么办 锁舌头坏了怎么办自救 门锁斜舌头断了怎么办 锁把手断了半截怎么办 门锁那一块掉了怎么办 qq动态密码忘了怎么办 小三怀孕了原配该怎么办 我当了小三怎么办 被降职后在单位怎么办 领导故意整我该怎么办 小孩怎么教育都不听怎么办 赵本山怎么办的刘涌 起诉离婚被告不出庭怎么办 安装u盘进入系统怎么办 思讯加密狗坏了怎么办 村主任选不出来怎么办 你的id已被停用怎么办 车牌摇号中签后怎么办 北京车卖了指标怎么办 车的电脑板坏了怎么办 饭卡消磁了怎么办妙招 有好项目没资金怎么办 买的股票涨停了怎么办 考研没过国家线怎么办 中石化的油卡怎么办 5173号被找回了怎么办 谭木匠梳子断了怎么办 198地块上的企业怎么办 天猫投诉不成立怎么办 顾客老嫌瓷砖贵怎么办 公司的公章丢了怎么办 物业不给充电费怎么办 怎么办社保卡去哪里办 单位没给社保卡怎么办 诈骗链接点开了怎么办 私人老板拖欠工资不给怎么办