思路:正着一遍bfs,反着输出
给定一个 n×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。
接下来
n
n
行,每行包含
n
n
个整数 0 或 1,表示迷宫。
输出格式
输出从左上角到右下角的最短路线,如果答案不唯一,输出任意一条路径均可。
按顺序,每行输出一个路径中经过的单元格的坐标,左上角坐标为 (0,0),右下角坐标为 (n−1,n−1)
数据范围
0≤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
#include<bits/stdc++.h> using namespace std; int f[1005][1005],t,tx,ty; int book[1005][1005]; int kx[4]={0,0,1,-1}; int ky[4]={1,-1,0,0}; struct vivo{ int x,y; }mi; queue< vivo > v; int n; int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>t; if(t) { f[i][j]=-1; book[i][j]=0; } else { f[i][j]=0; book[i][j]=1; } } book[n][n]=0; f[n][n]=1; mi.x=n; mi.y=n; v.push(mi); while(v.size()) { for(int i=0;i<4;i++) { tx=v.front().x+kx[i]; ty=v.front().y+ky[i]; if(tx>0&&ty>0&&tx<=n&&ty<=n&&book[tx][ty]) { book[tx][ty]=0; mi.x=tx; mi.y=ty; v.push(mi); f[tx][ty]=f[v.front().x][v.front().y]+1; } } v.pop(); } mi.x=1; mi.y=1; v.push(mi); printf("0 0\n"); while(v.size()) { for(int i=0;i<4;i++) { tx=v.front().x+kx[i]; ty=v.front().y+ky[i]; if(tx>0&&ty>0&&tx<=n&&ty<=n&&f[tx][ty]==f[v.front().x][v.front().y]-1) { printf("%d %d\n",tx-1,ty-1); mi.x=tx; mi.y=ty; v.push(mi); break; } } v.pop(); } return 0; }