这个是记录路径的bfs,但是其中最后打印路径的时候也用到了dfs的方法,所以就是,你先要记录一下,每一个点的爸爸是谁,然后最后找到地方了,dfs求解,打印路径
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int x , y , vis , px , py , item;
}d[6][6];
int dir[4][2] = {{0 , 1} , {1 , 0} , {-1 , 0} , {0 , -1}};
queue<node>q;
void print(node a)
{
if(a.x == 0 && a.y == 0){//递归实现,先到底
return;
}
print(d[a.px][a.py]);//因为是不断找祖先的,所以就酱,还有因为是找祖先,但是第一个点不是谁的祖先,所以要自己打
printf("(%d, %d)\n",a.px,a.py);
return;
}
void bfs()
{
node head ;
int dx , dy;
d[0][0].vis = 1;
d[0][0].px = -1;//上一个标记
d[0][0].py = -1;//上一个标记
q.push(d[0][0]);
while(!q.empty()){
head = q.front();
if(head.x == 4 && head.y == 4){
print(d[4][4]);//打印
}
q.pop();
for(int i = 0 ; i < 4 ; i++){
dx = head.x + dir[i][0];
dy = head.y + dir[i][1];
if(dx < 0 || dx >= 5 || dy < 0 || dy >= 5 || d[dx][dy].item == 1 || d[dx][dy].vis == 1)//看范围
continue;
d[dx][dy].px = head.x;//关键来啦,记住上一个点
d[dx][dy].py = head.y;
d[dx][dy].vis = 1;//标记
q.push(d[dx][dy]);
}
}
}
int main()
{
for(int i = 0 ; i < 5 ; i++){
for(int j = 0 ; j < 5 ; j++){
scanf("%d",&d[i][j].item);
d[i][j].x = i;
d[i][j].y = j ;
d[i][j].vis = 0;
d[i][j].px = 0;
d[i][j].py = 0;
}
}
while(!q.empty())
q.pop();
bfs();
printf("(4, 4)\n");
}