hdu1026 bfs

这个题很简单

就是bfs+保存路径

题意是:公主被抓走了,勇士去救公主,遇到点(.)时间加1,遇到X不饿能够通过,遇到数字就是遇到怪物,需要打败怪物需要的时间就是数值。

 

一开始用dfs做的,超时了,然后转为bfs,就过了,就是保存路径时有点麻烦,需要记录前一点的路径

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

char map[110][110];
int vis[110][110];
int n,m,mins,tt,count[110][110];
int dx[10010],dy[10010];

struct xxyy{
	int x,y;
}tmpdx[110][110];
int fx[4]={0,1,-1,0};
int fy[4]={1,0,0,-1};


void bfs(int x,int y){
	queue<pair<int,int> >que;
	que.push(make_pair(x,y));
	
	while(!que.empty()){
		x=que.front().first;
		y=que.front().second;
		que.pop();
		
		if(x==m-1&&y==n-1){
			if(count[x][y]<mins){
				tt=0;
				mins=count[x][y];
				int kx=x,ky=y;
				int a,b;
				dx[tt]=kx;
				dy[tt++]=ky;
				while(!(kx==0&&ky==0)){
					
					/*if(tt>20){
						break;
					}*/
					a=tmpdx[kx][ky].x;
					b=tmpdx[kx][ky].y;
					kx=a;
					ky=b;
					dx[tt]=kx;
					dy[tt++]=ky;
				//	printf("%d %d\n",kx,ky);
					
				}
				continue;
				//printf("%d %d\n",dx[i],dy[i]);
			}
		}
	
		if(count[x][y]>mins){
			continue;
		}
		for(int i=0;i<4;i++){
			int xx=x+fx[i];
			int yy=y+fy[i];
			
			
			if(xx>=m||yy>=n||xx<0||yy<0){
				continue;
			}
			if(map[xx][yy]!='X'&&!vis[xx][yy]){
				
				vis[xx][yy]=1;
				tmpdx[xx][yy].x=x;
				tmpdx[xx][yy].y=y;
				
				if(map[xx][yy]=='.'){
				//printf("%d %d\n",xx,yy);
					count[xx][yy]=count[x][y]+1;
					if(count[xx][yy]<mins)
					que.push(make_pair(xx,yy));
				}
				else if(map[xx][yy]>='1'&&map[xx][yy]<='9'){
				//printf("%d %d\n",xx,yy);
					count[xx][yy]=count[x][y]+map[xx][yy]-'0'+1;
					if(count[xx][yy]<mins)
					que.push(make_pair(xx,yy));
				}
			}
		}
	
	}	
}


int main(){
	//freopen("c:\\1.txt","r",stdin);
	while(scanf("%d%d",&m,&n)!=EOF){
		mins=1<<30;
		memset(count,0,sizeof(count));
		memset(vis,0,sizeof(vis));
		//printf("%d\n",mins);
		for(int i=0;i<m;i++){
			scanf("%s",map[i]);
			//printf("%s\n",map[i]);
		}
		//printf("%c\n",map[m-1][n-1]);
		vis[0][0]=1;
		bfs(0,0);
		if(mins==1<<30){
			printf("God please help our poor hero.\nFINISH\n");
			continue;
		}
		printf("It takes %d seconds to reach the target position, let me show you the way.\n",mins);
		int k=1;
		for(int i=tt-2;i>=0;i--){
			if(map[dx[i]][dy[i]]=='.'){
			
				printf("%ds:(%d,%d)->(%d,%d)\n",k++,dx[i+1],dy[i+1],dx[i],dy[i]);
			}
			if(map[dx[i]][dy[i]]>='1'&&map[dx[i]][dy[i]]<='9'){
				printf("%ds:(%d,%d)->(%d,%d)\n",k++,dx[i+1],dy[i+1],dx[i],dy[i]);
				for(int j=0;j<map[dx[i]][dy[i]]-'0';j++){
					printf("%ds:FIGHT AT (%d,%d)\n",k++,dx[i],dy[i]);
				}
			}
			
		}
		printf("FINISH\n");
	}
	return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值