HDU 1242 Rescue(BFS或BFS+优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1242
题意:有个R*C的迷宫,里面有一个a和多个r和多个x,现在你要从这多个r点走到a点去,且如果各自是x,则要花时间消灭守卫,即多花1分钟.问你从任意r点到a的最少时间是多少?
分析:
网上题解多说用优先队列,但是对于为什么用优先队列可以解,解释很少.
现在假设我们从多个r源点往a走,我们不能走已经被别人走过的或自己之前走过的格子.这句话的意思是说:如果有任意一个人走到(1,1)格子上花了1分钟,那么如果你再次走到(1,1)格子上花了>=1分钟的时间,你当前状态可以抛弃,因为后面你无论怎么走你也不可能快过之前走的人.
可能你会想如果之前的人因为消灭守卫花了时间,我是不是能超过他?不可能的,因为如果你在他消灭守卫之前赶上他,你也要消灭守卫.如果之后追到他(假设守卫被他消灭,你已经不用消灭了),你也最多是和他同样的状态.所以你这个目前状态是可以被抛弃的.
此题可以用优先队列+BFS来做,也可以不用优先队列,只用BFS做,就像我前面做过的一题一样,不过忘了哪题了.
不用优先队列的话,要用dist[r][c]来表示到达(r,c)点的最少时间,如果当前状态时间>=dist[r][c]直接抛弃即可.
AC代码:未用优先队列,93ms.
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=200+5;
int dr[]={-1,1,0,0};
int dc[]={0,0,-1,1};
int R,C;
char map[maxn][maxn];
int dist[maxn][maxn];//最小时间
struct Node
{
int r,c,d;//d表示时间
Node(){}
Node(int r,int c,int d):r(r),c(c),d(d){}
};
Node s[maxn*maxn];
int cnt;
int er,ec;
int BFS()
{
queue<Node> Q;
memset(dist,-1,sizeof(dist));
for(int i=0;i<cnt;i++)
{
Q.push(s[i]);
dist[s[i].r][s[i].c]=0;
}
while(!Q.empty())
{
Node node=Q.front(); Q.pop();
int r=node.r, c=node.c;
for(int d=0;d<4;d++)
{
int nr=r+dr[d], nc=c+dc[d];
if(nr<0||nr>=R||nc<0||nc>=C||map[nr][nc]=='#') continue;
int ndist = map[nr][nc]=='x'? node.d+2:node.d+1;
if(dist[nr][nc]==-1||dist[nr][nc]>ndist)
{
dist[nr][nc]=ndist;
Q.push(Node(nr,nc,ndist));
}
}
}
return dist[er][ec];
}
int main()
{
while(scanf("%d%d",&R,&C)==2)
{
cnt=0;
for(int i=0;i<R;i++)
for(int j=0;j<C;j++)
{
scanf(" %c",&map[i][j]);
if(map[i][j]=='r')
{
s[cnt++]=Node(i,j,0);
map[i][j]='.';
}
else if(map[i][j]=='a')
{
er=i,ec=j;
}
}
int ans=BFS();
if(ans==-1) printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",ans);
}
return 0;
}
分享到:
相关推荐
hdu 1695 GCD(欧拉函数+容斥原理).docx
hdu 3085 一道bfs题 一点值得注意的,鬼魅先走,mm与gg后走,直接模拟这个这个场景,突出时间的先后性,一秒与一秒的区别。。。这样模拟很难出错
acm hdu as easy as a+b
ACM题库,一些题目和答案,以及解题报告,传上来共享
本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!
杭电OnlineJudge 200-2099的解题报告
300+ AC 代码 。 大数 , 线段树 , 字符串 , dp.....
hdu 3341(ac自动机+状态压缩) 题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A、T、C、G其中...
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
杭电ACMhdu1163
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
HDU的一题........HDU DP动态规
【HDU 3993】田忌赛马 题解+勘误 题解这里就略写一下了,主要是勘误。 这道题是2011年之前的多校训练题,2020年的今天,我们一个集训队全部挂在上面了。最后在HDU看到了9年前的讨论区,才知道这题有如下问题: speed...
hdu2101AC代码
hdu acm 教案 搜索入门 hdu acm 教案 搜索入门
搜索 dfs 解题代码 hdu1241
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。