5 6 .XX.1. ..X.2. 2...X. ...XX. XXXXX. 5 6 .XX.1. ..X.2. 2...X. ...XX. XXXXX1 5 6 .XX... ..XX1. 2...X. ...XX. XXXXX.
It takes 13 seconds to reach the target position, let me show you the way. 1s:(0,0)->(1,0) 2s:(1,0)->(1,1) 3s:(1,1)->(2,1) 4s:(2,1)->(2,2) 5s:(2,2)->(2,3) 6s:(2,3)->(1,3) 7s:(1,3)->(1,4) 8s:FIGHT AT (1,4) 9s:FIGHT AT (1,4) 10s:(1,4)->(1,5) 11s:(1,5)->(2,5) 12s:(2,5)->(3,5) 13s:(3,5)->(4,5) FINISH It takes 14 seconds to reach the target position, let me show you the way. 1s:(0,0)->(1,0) 2s:(1,0)->(1,1) 3s:(1,1)->(2,1) 4s:(2,1)->(2,2) 5s:(2,2)->(2,3) 6s:(2,3)->(1,3) 7s:(1,3)->(1,4) 8s:FIGHT AT (1,4) 9s:FIGHT AT (1,4) 10s:(1,4)->(1,5) 11s:(1,5)->(2,5) 12s:(2,5)->(3,5) 13s:(3,5)->(4,5) 14s:FIGHT AT (4,5) FINISH God please help our poor hero. FINISH
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026
题目很好理解,要走离妖怪远的且最短时间能走出来的路走,若必须经过妖怪,那就用优先队列进行筛选走妖怪弱的路径,以便尽快出迷宫救出公主,搜索还是一般的搜索模式,就是在搜索时定义一个结构体数组保存下路径即可
源代码为:
#include <stdio.h> #include <string.h> #include <queue> #include<iostream> using namespace std; struct node{ int x,y; int time; friend bool operator < (node a,node b){ return a.time>b.time; } }; int n,m; char Map[105][105]; int fig[105][105]; node pre[105][105]; int ans,Time; const int c[4][2]={1,0,-1,0,0,1,0,-1}; bool check(int i,int j){ if(i<0 || j<0 || i>=n || j>=m || Map[i][j]=='X') return false; return true; } void show(node now){ if(now.x==0 && now.y==0) return; show(pre[now.x][now.y]); if(fig[pre[now.x][now.y].x][pre[now.x][now.y].y]){ for(int i=0;i<fig[pre[now.x][now.y].x][pre[now.x][now.y].y];i++){ printf("%ds:FIGHT AT (%d,%d)\n",++Time,pre[now.x][now.y].x,pre[now.x][now.y].y); } } printf("%ds:(%d,%d)->(%d,%d)\n",++Time,pre[now.x][now.y].x,pre[now.x][now.y].y,now.x,now.y); } void bfs(){ priority_queue<node>q; node st,ed; st.x=0; st.y=0; st.time=0; q.push(st); while(!q.empty()){ st=q.top(); q.pop(); if(st.x==n-1 && st.y==m-1){ ans=st.time; break; } for(int i=0;i<4;i++){ ed.x=st.x+c[i][0]; ed.y=st.y+c[i][1]; ed.time=st.time+1; if(!check(ed.x,ed.y)) continue; if(Map[ed.x][ed.y]>='0' && Map[ed.x][ed.y]<='9'){ ed.time+=Map[ed.x][ed.y]-'0'; fig[ed.x][ed.y]=Map[ed.x][ed.y]-'0'; } Map[ed.x][ed.y]='X'; pre[ed.x][ed.y]=st; q.push(ed); } } if(ans){ printf("It takes %d seconds to reach the target position, let me show you the way.\n",ans); show(st); } else return; } int main() { int kk; while(~scanf("%d%d",&n,&m)){ kk=0; memset(Map,0,sizeof(Map)); memset(fig,0,sizeof(fig)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>Map[i][j]; if(Map[n-1][m-1]>='0' && Map[n-1][m-1]<='9') kk=Map[n-1][m-1]-'0'; ans=0; Time=0; Map[0][0]='X'; bfs(); if(!ans) printf("God please help our poor hero.\n"); else{ for(int i=0;i<kk;i++){ printf("%ds:FIGHT AT (%d,%d)\n",++Time,n-1,m-1); } } printf("FINISH\n"); } return 0; }