hdu Ignatius and the Princess I

来源:互联网 发布:午夜美女直播软件 编辑:程序博客网 时间:2024/05/19 12:29

一个标准的BFS问题

思路如下:

运用BFS 搜索地图,如果某个点到达花费的时间比之前到达花费的时间少,那么就用本次到达的时间标记这个点,然后储存路径我用的数组LJ[][],打印整条路径即可

注意

1.储存路径的时候只能存储某个点的来源,因此无法打印入口到出口的,所以反向搜索,从出口往入口搜,这样就能保存一条入口到出口的路了

2.某个点可能因为先后到达的时间不同而多次经过,如下面这个数据

.9...

.9.9.

...9.


代码如下:

<pre name="code" class="cpp">#include<stdio.h>#include<string.h>#include<queue>using namespace std;int map[102][102];struct MAP{int x;int y;};int m,n;queue<MAP>q;MAP visit[102][102],t,DIAN;int TIME[102][102];void BFS(){while(!q.empty())q.pop();DIAN.x=m-1;DIAN.y=n-1;TIME[DIAN.x][DIAN.y]=0;q.push(DIAN);int chose[5][2]={0,0,0,1,0,-1,1,0,-1,0};while(!q.empty()){DIAN=q.front();q.pop();for(int i=1;i<=4;i++){t.x=DIAN.x+chose[i][0];t.y=DIAN.y+chose[i][1];if(t.x<=m-1 && t.y<=n-1 && t.x>=0 && t.y>=0 && map[t.x][t.y]!='X'){if(map[t.x][t.y]=='.' && TIME[t.x][t.y]>TIME[DIAN.x][DIAN.y]+1){TIME[t.x][t.y]=TIME[DIAN.x][DIAN.y]+1;q.push(t);visit[t.x][t.y].x=DIAN.x;visit[t.x][t.y].y=DIAN.y;}else if(map[t.x][t.y]!='.' && TIME[t.x][t.y]>TIME[DIAN.x][DIAN.y]+map[t.x][t.y]+1-'0'){TIME[t.x][t.y]=TIME[DIAN.x][DIAN.y]+map[t.x][t.y]+1-'0';q.push(t);visit[t.x][t.y].x=DIAN.x;visit[t.x][t.y].y=DIAN.y;}}}}}int main(){while(~scanf("%d%d",&m,&n)){memset(visit,0,sizeof(visit));memset(map,0,sizeof(map));int i=0,j=0;for(i=0;i<102;i++){for(j=0;j<102;j++)TIME[i][j]=9999;}getchar();for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%c",&map[i][j]);}getchar();}BFS();int X=0,Y=0,time;if(TIME[0][0]==9999){printf("God please help our poor hero.\n");printf("FINISH\n");}else{if(map[m-1][n-1]!='.'){time=TIME[0][0]+map[m-1][n-1]-'0';}else time=TIME[0][0];printf("It takes %d seconds to reach the target position, let me show you the way.\n",time);for(i=1;i<=TIME[0][0];i++){if(TIME[X][Y]-TIME[visit[X][Y].x][visit[X][Y].y]!=1){int temp=TIME[X][Y]-TIME[visit[X][Y].x][visit[X][Y].y]-1;while(temp--){printf("%ds:FIGHT AT (%d,%d)\n",i,X,Y);i++;}}printf("%ds:(%d,%d)->(%d,%d)\n",i,X,Y,visit[X][Y].x,visit[X][Y].y);int AX=X,AY=Y;X=visit[AX][AY].x;Y=visit[AX][AY].y;}while(i<=time){printf("%ds:FIGHT AT (%d,%d)\n",i,X,Y);i++;}printf("FINISH\n");}}}            


                                             
0 0