版权声明:版权归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;
}