概述
链接:点击打开链接
题意:r为起点,a为终点,没走一步需要花费一个单位时间,x为怪,遇到怪可以考虑打怪,打怪会花费一个单位时间,问走到终点最少花费时间为多少
代码:
#include <queue>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int n,m,enx,eny;
int xx[]={-1,0,1,0};
int yy[]={0,-1,0,1};
char s[205][205];
struct node{
int x,y,sum;
};
struct cmp{
bool operator()(node a,node b){
return a.sum>b.sum;
}
};
int bfs(node st){
priority_queue<node,vector<node>,cmp>q; //时间最少要用优先队列
node cur,temp;
int i,j;
q.push(st);
while(q.size()){
cur=q.top();q.pop();
if(cur.x==enx&&cur.y==eny) //这里要用坐标,因为所有走过的路都变为了#
return cur.sum;
for(i=0;i<4;i++){
temp.x=cur.x+xx[i];
temp.y=cur.y+yy[i];
if(temp.x>=1&&temp.x<=n&&temp.y>=1&&temp.y<=m)
if(s[temp.x][temp.y]!='#'){
if(s[temp.x][temp.y]=='.')
temp.sum=cur.sum+1;
else if(s[temp.x][temp.y]=='x')
temp.sum=cur.sum+2;
q.push(temp);
s[temp.x][temp.y]='#'; //走过的就变为#
}
}
}
return 0;
} //bfs模板
int main(){
int i,j,ans;
node st;
while(cin>>n>>m){
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
cin>>s[i][j];
if(s[i][j]=='r')
st.x=i,st.y=j,st.sum=0;
if(s[i][j]=='a')
enx=i,eny=j;
}
ans=bfs(st);
if(ans!=0)
printf("%dn",ans);
else
printf("Poor ANGEL has to stay in the prison all his life.n");
}
return 0;
}
最后
以上就是落后蜻蜓为你收集整理的hdu1242的全部内容,希望文章能够帮你解决hdu1242所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复