hdu Ignatius and the Princess I

一个标准的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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值