题目:K - 迷宫问题
思路:bfs每次记录父节点的位置,找到终点后,利用递归来还原路径
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cstdio>
#define PII pair<int, int>
#define LL long long
#define fi first
#define se second
using namespace std;
int mp[6][6], st[6][6];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
queue <PII> qu;
PII pre[6][6];
void find(PII x) // 递归往上找
{
if(!x.fi && !x.se)
{
printf("(%d, %d)\n", x.fi, x.se);
return ;
}
find(pre[x.fi][x.se]);
printf("(%d, %d)\n", x.fi, x.se);
}
void bfs()
{
qu.push(make_pair(0, 0));
st[0][0] = 1;
while(!qu.empty())
{
PII t = qu.front();
qu.pop();
if(t.fi == 4 && t.se == 4)
{
find(make_pair(t.fi, t.se));
return ;
}
for(int i = 0; i < 4; i ++)
{
int tx = t.fi + dir[i][0];
int ty = t.se + dir[i][1];
if(tx < 0 || ty < 0 || tx >= 5 || ty >= 5 || st[tx][ty] || mp[tx][ty]) continue;
st[tx][ty] = 1;
qu.push(make_pair(tx, ty));
pre[tx][ty] = t; // 记录父节点
}
}
}
int main()
{
for(int i = 0; i < 5; i ++)
for(int j = 0; j < 5; j ++) cin >> mp[i][j];
bfs();
}