hdu 1026 Ignatius and the Princess I(优先队列+bfs)

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int n,m,num;
struct Node{
	int x,y;
	int time;
	int prex,prey;
	char c;
	
	bool operator>(const Node & node) const{
		return time>node.time;
	}
};
Node node[105][105];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
bool BFS(){
	//queue<Node> pq;
	priority_queue<Node,vector<Node>,greater<Node> > pq;
	node[0][0].time=0;
	pq.push(node[0][0]);
	while(!pq.empty()){
		Node now=pq.top();
		//Node now=pq.front();
		pq.pop();
		for(int i=0;i<4;i++){
			int x=now.x+dir[i][0];   //下一个点 
			int y=now.y+dir[i][1];
			if(x>=0&&x<n&&y>=0&&y<m&&node[x][y].c=='.'){
				if(node[x][y].time>now.time+1){
					node[x][y].time=now.time+1;
					node[x][y].prex=now.x;
					node[x][y].prey=now.y;
					pq.push(node[x][y]);
					//printf("点(%d,%d)压入栈中\n",node[x][y].x,node[x][y].y);
				}
			}else if(x>=0&&x<n&&y>=0&&y<m&&node[x][y].c>='0'&&node[x][y].c<='9'){
				if(node[x][y].time>now.time+node[x][y].c-'0'+1){
					node[x][y].time=now.time+node[x][y].c-'0'+1;
					node[x][y].prex=now.x;
					node[x][y].prey=now.y;
					pq.push(node[x][y]);
					//printf("点(%d,%d)压入栈中\n",node[x][y].x,node[x][y].y);
				}
			}
			//cout<<x<<y<<endl;
			if(x==n-1&&y==m-1)
				return true;
		}
	}
	return false;
	
}
void print_result(int i,int j){
	if(i==0&&j==0)
		return;
	int px=node[i][j].prex;//前一点坐标 
	int py=node[i][j].prey;
	print_result(px,py);
	printf("%ds:(%d,%d)->(%d,%d)\n",node[px][py].time+1,node[px][py].x,node[px][py].y,node[i][j].x,node[i][j].y);
	if(node[i][j].c>='0'&&node[i][j].c<='9'){
		for(int tmp=node[px][py].time+2;tmp<node[px][py].time+2+node[i][j].c-'0';tmp++){
			printf("%ds:FIGHT AT (%d,%d)\n",tmp,node[i][j].x,node[i][j].y);
		}
	}
}
int main(){
	
	while(~scanf("%d%d",&n,&m)){
		getchar();
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				scanf("%c",&node[i][j].c);
				node[i][j].x=i;node[i][j].y=j;
				node[i][j].time=inf;
			}
			getchar();
		}
		bool state=false;
		state=BFS();
		if(!state){
			printf("God please help our poor hero.\n");
		}else{
			printf("It takes %d seconds to reach the target position, let me show you the way.\n",node[n-1][m-1].time);
			print_result(n-1,m-1);
		}
		printf("FINISH\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白白白白白8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值