写的和1242基本一模一样,这个方法在权值很小的情况下还不错,要是有100000的延迟就完了。 #include <stdio.h> #define N 101 #define MAX 0x7ffffff int n,m; int Min; int base=0,top=0; char map[N][N]; int pre[N][N]; bool vis[N][N]; struct { int i,j; }path[N*N]; int len; int mo[4][2]={{-1,0},{0,1},{0,-1},{1,0}}; struct { int i,j; int time; int delay; }t[N*N*10]; void push(int i,int j,int time,int delay) { t[top].i=i; t[top].j=j; t[top].time=time; t[top].delay=delay; top++; } void bfs() { int i,j,in,jn,k,delay;//广搜加延迟 top=base=0; push(0,0,0,0); vis[0][0]=1; while(top!=base) { if (t[base].delay) { push(t[base].i,t[base].j,t[base].time+1,t[base].delay-1); base++; continue; } else { i=t[base].i; j=t[base].j; for (k=0;k<4;k++) { in=i+mo[k][0]; jn=j+mo[k][1]; if (in>=0 && in<n && jn>=0 && jn<m && !vis[in][jn]) { vis[in][jn]=1; pre[in][jn]=3-k; if (in==n-1 && jn==m-1) { if (map[in][jn]=='.') delay=0; else delay=map[in][jn]-'0'; Min=t[base].time+delay+1; return; } if (map[in][jn]=='.') delay=0; else delay=map[in][jn]-'0'; push(in,jn,t[base].time+1,delay); } } base++; } } } void find(int i,int j) { int p=pre[i][j]; path[len].i=i; path[len].j=j; len++; if (i==0 && j==0) return; find(i+mo[p][0],j+mo[p][1]); } int main () { //freopen("1.txt","r",stdin); int i,j,k,time; while(scanf("%d%d%*c",&n,&m)!=EOF) { for (i=0;i<n;i++) { for (j=0;j<m;j++) { scanf("%c",&map[i][j]); if (map[i][j]=='X') vis[i][j]=1; else vis[i][j]=0; } getchar(); } Min=MAX; bfs(); if (Min!=MAX) { printf("It takes %d seconds to reach the target position, let me show you the way./n",Min); len=0; find(n-1,m-1); for (j=1,k=len-1;k>0;k--) { printf("%ds:(%d,%d)->(%d,%d)/n",j++,path[k].i,path[k].j,path[k-1].i,path[k-1].j); if (map[path[k-1].i][path[k-1].j]!='.') { time=map[path[k-1].i][path[k-1].j]-'0'; while(time--) { printf("%ds:FIGHT AT (%d,%d)/n",j++,path[k-1].i,path[k-1].j); } } } } else printf("God please help our poor hero./n"); printf("FINISH/n"); } }