做题目的时候,遇见了两个类型十分相似的题目,可以一个直接输出最短的步数,一个要保存,,这个就很犯难
然后通过这两题,有重新了解了一个BFS与DFS的区别
一、路径的输出
1.dfs
DFS其实就是一直顺着一个方向不断的搜索知道找到了目标为止。路径输出的时候,利用记录前面的点即可
#include
#include
#include
#include
using namespace std;
#define N 9
int cnt;
struct Point{
int x;
int y;
}path[N*N];
int maze[N][N];
int vis[N][N];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
Point star,end;
void output()
{
printf("(%d,%d)->",star.x,star.y);
for(int i=1;i",path[i].x,path[i].y);
printf("(%d , %d)\n\n" , end.x , end.y);
printf("\n");
}
void DFS(int x,int y,int step)
{
int tmp_x,tmp_y;
Point p;
if(x==end.x&&y==end.y)
{
cnt=step;
output();
return;
}
for(int i=0;i<4;i++)
{
temp_x=x+dir[i][0];
temp_y=y+dir[i][1];
p.x=tmp_x;
p.y=tmp_y;
if(!maze[tmp_x][tmp_y]&&!vis[tmp_x][tmp_y])
{
vis[x][y]=1;
path[step]=p;//标记前面一个点
DFS(tmp_x,tmp_y,step+1);
vis[x][y]=0;
}
}
}
int main(){
memset(vis , 0 , sizeof(vis));
DFS(star.x , star.y , 1);
return 0;
}
2 bfs
bfs就是不断向四周扩展,然后找到目标节点,利用数组模拟队列(或者直接利用STL的队列,可是STL里面的队列用于保存路径有些麻烦,适用于求最小步数)
#include
#include
#include
#include
#include