给定一个 n×nn×n 的二维数组,如下所示:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
数据保证至少存在一条从左上角走到右下角的路径。

输入格式

第一行包含整数 n。
接下来 nn 行,每行包含 nn 个整数 0 或 1,表示迷宫。

输出格式

输出从左上角到右下角的最短路线,如果答案不唯一,输出任意一条路径均可。
按顺序,每行输出一个路径中经过的单元格的坐标,左上角坐标为 (0,0)(0,0),右下角坐标为 (n−1,n−1)(n−1,n−1)。

数据范围

0≤n≤10000≤n≤1000

输入样例:

5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0

输出样例:

0 0 1 0 2 0 2 1 2 2 2 3 2 4 3 4 4 4


  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define x first
  5. #define y second
  6. using namespace std;
  7. typedef pair<int,int> PII;
  8. const int N = 1010;
  9. int g[N][N];
  10. PII q[N*N];
  11. PII pre[N][N];
  12. int n;
  13. int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};
  14. void bfs(int sx, int sy) {
  15. int hh = 0, tt = 0;
  16. q[0] = {sx,sy};
  17. //判重
  18. memset(pre,-1,sizeof pre);
  19. pre[sx][sy] = {0,0};
  20. while (hh <= tt) {
  21. PII t = q[hh++];
  22. for (int i = 0; i < 4; ++i) {
  23. int a = t.x + dx[i], b = t.y + dy[i];
  24. if (a < 0 || a >= n || b < 0 || b >= n) continue;
  25. //之前更新过
  26. if (pre[a][b].x != -1) continue;
  27. if (g[a][b] == 1) continue;
  28. q[++tt] = {a,b};
  29. pre[a][b] = {t.x,t.y};
  30. }
  31. }
  32. }
  33. int main() {
  34. cin >> n;
  35. for (int i = 0; i < n; ++i)
  36. for (int j = 0; j < n; ++j)
  37. cin >> g[i][j];
  38. //倒着搜,输出路径就是正着
  39. bfs(n-1,n-1);
  40. PII end(0,0);
  41. while (true) {
  42. cout << end.x << " " << end.y << endl;
  43. if (end.x == n-1 && end.y == n-1) break;
  44. end = pre[end.x][end.y];
  45. }
  46. return 0;
  47. }