全排列
void dfs(int step)
{
if(step == n)
{
for(int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return;
}
for(int i = 1; i <= n; i++)
{
if(book[i] == 0)
{
a[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0;
}
}
}
思想:
void dfs(int step)
{
判断边界
尝试每一种可能for(int i = 1; i <= n; i++)
{
继续下一步dfs(step+1);
}
返回
}
每一种尝试都是一种“扩展”
深度优先遍历(dfs)
主要思想:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未被访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。
走迷宫(dfs)
使用递归。
思路:从起始点出发,一直走,直至不能继续走下去,再去尝试别的路径。
void dfs(int x, int y, int step)
{
判断是否达到终止条件
尝试每一种可能for(int i = 0; i < 4; i++) //几个能走的方向
{
判断是否越界
判断是是否为障碍物或者已经在路径中
继续走下一步
}
返回
}
广度优先遍历(bfs)
主要思想:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有顶点都已经被访问过,遍历结束。
走迷宫(层层递进-bfs)
使用队列结构。
思路:从起始点出发,将通过该点能够到达的结点加入队列,扩展结点,然后对下一个结点(head++)
进行处理,直至能够扩展到目标结点。
结构体:
struct node //队列
{
int x; //横坐标
int y; //纵坐标
int s; //步数
};
bfs中的标记
在复习这部分的时候,注意到有的题目需要取消标记,例如:
book[x] = 1;
dfs(i);
book[x] = 0;
而有的则不需要。
关于标记是否取消,如果深搜的目的是遍历整张图,标记已经走过的点可以方便找没走过的,这种情况下可以不取消;如果深搜的目的是找一条路,如最短路、找到终点等,需要取消标记才能尝试下一种。