1.保留路径
#include <bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define fi first
#define se second
#define endl '\n'
#define pb push_back
#define ll long long
#define PII pair<int, int>
#define mod 1000000007
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, 1, -1};
const int N = 2010;
vector<int> vi;
int n;
int g[N][N];
bool vis[N][N];
queue<PII> q;
PII pre[N][N];
void bfs(int x, int y)
{
q.push({x, y});
vis[x][y] = 1;
while(q.size())
{
auto t = q.front();
int x = t.fi, y = t.se;
q.pop();
for(int i = 0; i < 4; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if(tx < 0 or ty < 0 or tx >= n or ty >= n or vis[tx][ty] or g[tx][ty])
continue;
vis[tx][ty] = 1;
q.push({tx, ty});
pre[tx][ty] = t;
//cout << tx << " " << ty << " 前驱是 " << t.fi << " " << t.se << endl;
}
}
}
int main()
{
ios;
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> g[i][j];
bfs(0, 0);
PII end(4, 4);
while(1)
{
cout << end.fi << " " << end.se << endl;
if(end.fi == 0 and end.se == 0) break;
end = pre[end.fi][end.se];
}
return 0;
}
2.dfs + bfs
#include <bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define fi first
#define se second
#define endl '\n'
#define pb push_back
#define ll long long
#define PII pair<int, int>
#define mod 1000000007
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, 1, -1};
const int N = 2010;
int n;
bool st[N][N];
int g[N][N], f[N][N];
queue<PII> q;
vector<PII> ans;
void bfs()
{
q.push({0, 0});
st[0][0] = true;
while (q.size())
{
PII t = q.front();
q.pop();
int x = t.first, y = t.second;
if (x == n - 1 && y == n - 1)
break;
for (int i = 0; i < 4; ++i)
{
int nx = x + dx[i], ny = dy[i] + y;
if (nx >= 0 && nx < n && ny >= 0 && ny < n && !st[nx][ny] && g[nx][ny] == 0)
{
q.push({nx, ny});
f[nx][ny] = f[x][y] + 1;
st[nx][ny] = true;
}
}
}
}
void dfs(int x, int y)
{
ans.push_back({x, y});
for (int i = 0; i < 4; ++i)
{
int nx = x + dx[i], ny = dy[i] + y;
if (nx >= 0 && nx < n && ny >= 0 && ny < n && f[nx][ny] + 1 == f[x][y] && g[nx][ny] == 0)
{
dfs(nx, ny);
break;
}
}
}
int main()
{
ios;
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> g[i][j];
bfs();
dfs(n - 1, n - 1);
reverse(ans.begin(), ans.end());
for (int i = 0; i < ans.size(); ++i)
{
cout << ans[i].first << " " << ans[i].second << endl;
}
return 0;
}