概述
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242
题意:朋友(r)杀敌人(x)救天使(a),时间最短型走迷宫,走格子耗时1s,杀敌人额外耗时1s。
思路:与步数最少的走迷宫不同,时间最少要使用优先队列,时间小的优先出队(据说HDU普通队列也能过……)
有可能会有多个朋友,所以从a开始搜r比较简单。
网上看到另一种方法,就是把杀护卫和走到护卫那个格子看成两个动作等于说是入队两次。
昨天看别人的解题报告刚刚学会的用法(其实这题没必要……):
char g[205][205];
memset(g,'#',sizeof(g));
前几天才知道这类BFS或者DFS还有一个名字:Flood fill 算法……
Zoj的测试数据比较强。
#include <iostream>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
char g[205][205];
bool visit[205][205];
int n,m;
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
struct Node
{
int x,y,time;
bool operator < (Node b) const
{
return time>b.time;
}
}temp,cur,s;
bool OK (Node a)
{
if (visit[a.x][a.y]==false && g[a.x][a.y]!='#')
return true;
return false;
}
int BFS ()
{
int cnt=0;
priority_queue<Node> q;
q.push(s);
while (!q.empty())
{
cur = q.top();
q.pop();
if (g[cur.x][cur.y] == 'r')
{
cnt = cur.time;
break;
}
for (int i=0;i<4;i++)
{
temp.x=cur.x+dx[i];
temp.y=cur.y+dy[i];
temp.time=cur.time+1;
if (OK(temp))
{
visit[temp.x][temp.y]=true;
if (g[temp.x][temp.y]=='x')
temp.time+=1;
q.push(temp);
}
}
}
return cnt;
}
int main ()
{
while (~scanf("%d%d",&n,&m))
{
memset(g,'#',sizeof(g));
memset(visit,false,sizeof(visit));
for (int i=1;i<=n;i++)
{
scanf("%s",&g[i][1]);
g[i][m+1]='#';
for (int j=1;j<=m;j++)
if (g[i][j]=='a')
{
s.x=i;
s.y=j;
s.time=0;
visit[s.x][s.y]=true;
}
}
int ans=BFS();
if (ans)
printf("%dn",ans);
else
printf("Poor ANGEL has to stay in the prison all his life.n");
}
return 0;
}
最后
以上就是虚心冬日为你收集整理的Hdu 1242 & Zoj 1649 Rescue (优先队列+BFS)的全部内容,希望文章能够帮你解决Hdu 1242 & Zoj 1649 Rescue (优先队列+BFS)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复