刚开始做BFS专题时遇到它,因为路径保存放弃了
现在做,刚开始各种WA。。。。。
后来加了个优先队列,就AC了。。额。。
#include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream> #include <queue> #include <stack> #include<algorithm> #include<set> using namespace std; #define inf 2147483647 #define eps 1e-8 #define LL long long #define M 50005 #define mol 1000000007 int mov[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; struct node { int x,y,step; friend bool operator<(node a,node b) { return a.step>b.step; }; }; int n,m,vis[105][105]; char s[105][105]; int pd(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]!='X') return 1; return 0; } struct dire { int x,y; }f[101][101];//保存当前点的前一点的位置 void bfs() { priority_queue<node>Q; int ans=0,k,dx,dy; f[n-1][m-1].x=-1;//终点标志 vis[n-1][m-1]=1; node p,q; p.x=n-1; p.y =m-1; p.step =0; if(s[n-1][m-1]!='.') p.step =s[n-1][m-1]-'0'; Q.push(p); while(!Q.empty()) { p=Q.top (); Q.pop(); if(p.x==0&&p.y==0) { printf("It takes %d seconds to reach the target position, let me show you the way.\n",p.step); k=1; int a=p.x;//当前点 int b=p.y; while(f[a][b].x!=-1) { int c=f[a][b].x;//当前点的前一点 int d=f[a][b].y; printf("%ds:(%d,%d)->(%d,%d)\n",k++,a,b,c,d); if(s[c][d]!='.') { for(int l=0;l<s[c][d]-'0';l++) printf("%ds:FIGHT AT (%d,%d)\n",k++,c,d); } a=c; b=d; } printf("FINISH\n"); return; } q=p; for(int i=0;i<4;i++) { dx =q.x +mov[i][0]; dy =q.y+mov[i][1]; if(vis[dx][dy]==0&&pd(dx,dy)) { vis[dx][dy]=1; p.x=dx;p.y=dy; if(s[dx ][dy]!='.') p.step =q.step +s[dx][dy]-'0'+1; else p.step =q.step +1; f[dx][dy].x=q.x;//路径保存 f[dx][dy].y=q.y; Q.push(p); } } } printf("God please help our poor hero.\nFINISH\n"); } int main() { while(~scanf("%d%d",&n,&m)) { int i,j; memset(vis,0,sizeof(vis)); memset(f,0,sizeof(f)); for(i=0;i<n;i++) { scanf("%s",s[i]); } bfs(); } return 0; }