DFS深度优先遍历学习记录
这算是自己记录的学习笔记,避免以后学着学着忘了。。
题目名称:排列组合
题目描述
给出一个整数n,要求输出所有排列组合。
思路
dfs思路,使用两个数组,一个数组用于存储一个分支层级的数path,另一个布尔数组用来存储在该层是否有数还没有用过,用过为true
,没有用过为false。
在关键算法内,当u==n时,说明所有数字已经排列完,因为u从0开始,u == n说明已经超出数的长度一位,此时输出该分支层。
不等于时,循环遍历布尔类型的数组,直到找到没有被使用过的数,将数存进path数组中,并且将该数定义为使用过(转换为true),再使用递归遍历u+1,遍历完成后需要恢复现场。遍历完的状态是该层后面层全部遍历输出完了。
恢复现场有两步,一步是将下一层用掉的数补回0,第二步将数从true改为false。
以下给出核心代码。
int n;
int path[10];
bool stk[10];
void dfs(int u){
if(u==n){
for(int i = 0;i<n;i++)cout<<path[i]<<' ';
puts("");
return
}
for(int i =0;i<n;i++){
if(!stk[i]){
path[u] = i+1;
stk[i] = true;
dfs(u+1);
stk[i] = false;
}
}
}