原题传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649
Rescue
Time Limit: 2 Seconds Memory Limit: 65536 KB
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
Author: CHEN, Xue
Source: ZOJ Monthly, October 2003
分析:这道题用BFS可以解决,不过这里有坑~!在BFS时候,不能用queue队列,而应该用priority_queue优先队列,因为这里每条路径的每个点权值不一样,有x的权值是2,而‘.’的权值只有1,如果用queue找的紧紧是最短路径,而不是加权路径最短的那条,所以用优先队列来处理。
//图的BFS ZOJ 1649 #include <stdio.h> #include <queue> #include <string.h> using namespace std; const int MAXN = 210; char list[MAXN][MAXN]; bool isVisited[MAXN][MAXN]; bool flag; struct Step{ int x; int y; int step; bool operator < (const Step &rhs) const{ return rhs.step < step; } }; int m,n,mins; priority_queue<Step> pos; Step first,curStep; main(){ while(scanf("%d%d",&m,&n)!= EOF){ mins = 100000000; while(!pos.empty()){ pos.pop(); } flag = false; memset(isVisited,false,sizeof(isVisited)); for(int i=1;i<=m;i++){ scanf("%s",list[i]+1); } for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(list[i][j] == 'r'){ first.x = i; first.y = j; first.step = 0; } } } pos.push(first); isVisited[first.x][first.y] = true; while(!pos.empty()){ curStep = pos.top(); pos.pop(); if(list[curStep.x][curStep.y] == 'a'){ // printf("%d---%d",curStep.x,curStep.y); flag = true; mins = (mins>curStep.step)?curStep.step:mins; } if((list[curStep.x-1][curStep.y]=='.'||list[curStep.x-1][curStep.y]=='x'|| list[curStep.x-1][curStep.y]=='a') && curStep.x-1>0 && !isVisited[curStep.x-1][curStep.y]){ Step newStep; newStep.x = curStep.x-1; newStep.y = curStep.y; if(list[curStep.x-1][curStep.y]=='.'||list[curStep.x-1][curStep.y]=='a'){ newStep.step = curStep.step + 1; }else{ newStep.step = curStep.step + 2; } pos.push(newStep); isVisited[curStep.x-1][curStep.y] = true; // printf("%d - %d\n",newStep.x,newStep.y); } if((list[curStep.x+1][curStep.y]=='.'||list[curStep.x+1][curStep.y]=='x'|| list[curStep.x+1][curStep.y]=='a') && curStep.x+1<=m && !isVisited[curStep.x+1][curStep.y]){ Step newStep; newStep.x = curStep.x+1; newStep.y = curStep.y; if(list[curStep.x+1][curStep.y]=='.'||list[curStep.x+1][curStep.y]=='a'){ newStep.step = curStep.step + 1; }else{ newStep.step = curStep.step + 2; } pos.push(newStep); isVisited[curStep.x+1][curStep.y] = true; // printf("%d - %d\n",newStep.x,newStep.y); } if((list[curStep.x][curStep.y-1]=='.'||list[curStep.x][curStep.y-1]=='x'|| list[curStep.x][curStep.y-1]=='a') && curStep.y-1>0 && !isVisited[curStep.x][curStep.y-1]){ Step newStep; newStep.x = curStep.x; newStep.y = curStep.y-1; if(list[curStep.x][curStep.y-1]=='.'||list[curStep.x][curStep.y-1]=='a'){ newStep.step = curStep.step + 1; }else{ newStep.step = curStep.step + 2; } pos.push(newStep); isVisited[curStep.x][curStep.y-1] = true; // printf("%d - %d\n",newStep.x,newStep.y); } if((list[curStep.x][curStep.y+1]=='.' ||list[curStep.x][curStep.y+1]=='x'|| list[curStep.x][curStep.y+1]=='a' )&& curStep.y+1<=n && !isVisited[curStep.x][curStep.y+1]){ Step newStep; newStep.x = curStep.x; newStep.y = curStep.y+1; if(list[curStep.x][curStep.y+1]=='.'||list[curStep.x][curStep.y+1]=='a'){ newStep.step = curStep.step + 1; }else{ newStep.step = curStep.step + 2; } pos.push(newStep); isVisited[curStep.x][curStep.y+1] = true; // printf("%d - %d\n",newStep.x,newStep.y); } } if(flag){ printf("%d\n",mins); }else{ printf("Poor ANGEL has to stay in the prison all his life.\n" ); } } }
相关推荐
【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...
【标题】"zoj 源码700题"是指一个包含700多道ZOJ(在线判题系统Zhejiang Online Judge)编程竞赛题目的源代码集合。这个资源对于学习算法、提高编程技能以及准备编程竞赛的学员来说极具价值。 【描述】"包含了zoj...
ZOJ,全称“浙江大学程序在线评测系统”(Zhejiang University Online Judge),是一个提供信息学(算法竞赛)题库及程序评测的网站。以下是关于ZOJ的详细介绍: 一、基本信息 名称:浙江大学程序在线评测系统(ZOJ)...
浙江大学ZOJ(Zhejiang University Online Judge)是一个在线编程练习平台,主要服务于计算机科学和技术的学习者,特别是对算法和编程有浓厚兴趣的学生。这个平台提供了大量的编程题目,涵盖了各种难度和主题,帮助...
标题中的"ZOJ.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar" 提到了两个ZOJ(Zhejiang Online Judge)的题目,分别是1016和1045,这两个数字通常代表在线编程竞赛中的题目编号。这些题目通常涉及到算法和数据结构的...
Problem Arrangement zoj 3777
【标题】"ZOJ1027解题指南"是一个针对特定编程竞赛题目——ZOJ1027的解决方案集合。ZOJ,全称为“Zhejiang Online Judge”,是浙江大学主办的一个在线编程竞赛平台,提供了丰富的算法题目供参赛者练习和挑战。本解题...
【ZOJ.zip】是一个压缩包,里面包含了与ZOJ(Zhejiang Online Judge)相关的ACM(International Collegiate Programming Contest)题解。ZOJ是一个在线编程竞赛平台,它为参赛者提供了一系列算法题目进行练习,以...
ZOJ(Zhejiang Online Judge)是一个著名的在线编程竞赛平台,主要面向计算机科学与信息技术的学生和爱好者,提供了大量的算法题目供参赛者练习和提交代码。"ZOJ题目答案源码"是一个压缩包文件,其中包含了700多道...
zoj 题库 详细解答 解题代码 该资源主要涵盖了 zoj 题库中的各种编程题目,涵盖了基本算法、数据结构、数学运算等多个方面的知识点。下面是对该资源中出现的知识点的详细解释: 1. 第一次 ACM 总结(7th ACM) 该...
学习ACM程序设计的朋友一定要看,这是训练必备的POJ ZOJ题目分类及解题思路
ZOJ,全称为Zhejiang Online Judge,是一个知名的在线编程竞赛平台,主要服务于浙江大学和国内其他高校的学生,提供丰富的算法题目供参赛者练习和比赛。这个压缩包文件名为"ZOJ 700多题源代码",意味着它包含了解决...
《ZOJ 4041问题的正确解法与程序分析》 ZOJ(Zhejiang Online Judge)是一个知名的在线编程竞赛平台,其中的题目编号为4041的题目吸引了众多程序员的关注。本篇文章将深入探讨ZOJ 4041的正确解法,并对提供的源代码...
标题“ZOJ1014.zip_zoj code_zoj1004”表明这是一个与ZOJ(ZeroJudge)在线判题系统相关的代码压缩包,其中可能包含了解决ZOJ问题1004的源代码。ZOJ是面向编程爱好者和学生的一个在线编程竞赛平台,它提供了各种算法...
zoj 1003 c语言的,要写这么多描述吗。。
**ZOJ月赛题解 (ZOJ Monthly, August 2014)** ZOJ(Zhejiang Online Judge)是中国著名的在线编程竞赛平台之一,它为程序员和学生提供了丰富的算法练习和比赛机会。2014年8月的ZOJ月赛是一场面向广大编程爱好者的...
本代码是zoj上AC的1951的代码,把双重循环简化为O(n),不过素数判断的改进还不够
ZOJ(Zhejiang Online Judge)是一个著名的在线编程竞赛平台,尤其在ACM(国际大学生程序设计竞赛)领域中有着广泛的影响力。这个“ZOJ题解集合-截至2835”显然是一份包含了大量ZOJ题目解决方案的压缩包,其中涵盖了...
ZOJ1805代码
【ZOJ1003 Crashing Balloon】这个问题是一个经典的计算机科学竞赛编程题目,主要涉及动态规划(Dynamic Programming, DP)和贪心算法(Greedy Algorithm)的知识点。在这个问题中,参赛者需要编写程序来模拟气球...