链接:点击打开链接
题意: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("%d\n",ans); else printf("Poor ANGEL has to stay in the prison all his life.\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-28 22:52:23