1086.迷宫问题
Description
Input
Output
Sample Input
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
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4)
(4, 4)
刚接触bfs时这道题没有思路, 但现在突然想通了 ,希望可以帮到你们,详解代码
#include <stdio.h> #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; int dir[4][2] ={1,0, 0,1, -1,0, 0,-1}; int a[7][7]; bool visit[7][7]; 标记一个点是否访问过。以免陷入无限循环!! struct note 结构体记载横 纵坐标 { int x; int y; }s,pre[7][7];///pre【x】【y】用来记载(x,y)的前一个点 int bfs( ) { int i, j; queue<note>q; q.push( {0, 0}); visit[0][0] = 1; while( !q.empty( )) { s = q.front(); q.pop(); for( i = 0; i<4; i++) { int x = dir[i][0] + s.x; int y =dir[i][1] + s.y; if( a[x][y] == 0 && !visit[x][y] && x>=0 && x<=4 &&y<=4&&y>=0) { visit[x][y] = 1; q.push({x, y}); pre[x][y].x = s.x; pre[x][y].y = s.y; } } } } void put( int x, int y ) 这个函数我也是参考别人的代码 自己走走也能行得通 不过个人对递归
{ 理解不深
if( x == 0 && y == 0) 触底反弹, 比如 (4, 4)进来,put, put,,,,,直到(0,0)输出,然后 { 一层一层返回,执行printf printf("(%d, %d)\n", x, y); return ; } put( pre[x][y].x, pre[x][y].y); printf("(%d, %d)\n", x, y); } int main() { int i, j, k; for( i = 0; i<5; i++) for( j = 0; j<5; j++) scanf("%d", &a[i][j]); bfs(); put( 4, 4 ); return 0; }
有不妥的地方多多理解 谢谢观看