POJ 3984迷宫问题(输出路径)

版权声明:版权归Ordinarv所有 https://blog.csdn.net/ordinarv/article/details/82119800

题目大意

给你一个5*5的迷宫,0代表通路,1代表墙,找到从迷宫左上角到达右下角的最短路径,并输出路径。


思路

与其他直接输出最短路径的长度不同的是,这道题要求输出最短路径。要输出这个路径,所以就要考虑状态了,每一个状态都应该存储到达这个状态的路径。

对于我来说第一次做这种题难点在于如何存储路径,有两种类似的方法,一种是记录每次通过dx、dy数组移动的i值,二是直接把x、y放入队列中,最后输出队列内元素即可。

方法二


AC Code

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const int INF=0x3f3f3f3f;
int mp[6][6];
int dx[]= {1,-1,0,0},dy[]= {0,0,1,-1};
struct unt {
	int x,y,s;
	short l[30];
};

unt bfs() {
	queue<unt> q;
	unt cur,next;
	cur.x=0;
	cur.y=0;
	cur.s=0;
	q.push(cur);
	while(!q.empty()){
		cur=q.front();
		q.pop();
		if(cur.x==4&&cur.y==4) return cur;
		int xx,yy;
		for(int i=0;i<4;i++){
			xx=cur.x+dx[i];
			yy=cur.y+dy[i];
			if(xx>=0&&xx<5&&yy>=0&&yy<5&&mp[xx][yy]==0){
				next=cur;next.x=xx;next.y=yy;next.s=cur.s+1;
				next.l[cur.s]=i;
				q.push(next);
			}				 
		}
	}
}
int main() {
	for(int i=0; i<5; i++)
		for(int j=0; j<5; j++)
			scanf("%d",&mp[i][j]);
	unt ans=bfs();
	int x=0,y=0;
	for(int j=0;j<=ans.s;j++){
		printf("(%d, %d)\n",x,y);
		x+=dx[ans.l[j]];
		y+=dy[ans.l[j]];
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ordinarv/article/details/82119800