POJ3984
思路
用一个pre数组存储这个点的上一个点
##AC代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define inf 0x3f3f3f3f
//#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 10 + 1e5, mod = 1e9 + 7;
int g[10][11];
struct Node{int x,y;}pre[N/100][N/100];
int h, tai;
int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};
bool vis[10][10];
void bfs()
{
memset(vis, 0, sizeof vis);
queue<Node>q;
q.push({0,0});
pre[0][0]={-1,-1};
vis[0][0]=1;
while(q.size())
{
Node s=q.front();
q.pop();
if(s.x==4&&s.y==4)
return;
for(int i=0;i<4;i++)
{
int nx=s.x+dx[i],ny=s.y+dy[i];
if(nx<0||ny<0||nx>=5||ny>=5||vis[nx][ny]||g[nx][ny]==1)
continue;
vis[nx][ny]=1;
q.push({nx,ny});
pre[nx][ny]={s.x,s.y};
}
}
}
void show(Node s)
{
if(s.x==-1&&s.y==-1)
return;
show(pre[s.x][s.y]);
printf("(%d, %d)\n",s.x,s.y);
}
void solve()
{
int n = 5;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> g[i][j];
bfs();
show({4,4});
}
signed main()
{
solve();
return 0;
}