算法小萌新和你一起学习DFS排列组合!
Deepth First Search,是图结构的一种基本操作。首先选择任意一个点作为起点,然后选择一个与起点连通且没有到达过得点,将这个点再次作为起点,再次寻找下一个与该点连通且没有到达过得点。
换一句话说,想象成一个树,选择好一个分支,不停迭代,一直迭代到叶子节点,当遍历到叶子节点时,就没有办法继续向下迭代了,然后回到上一个节点,去选择没有走过的路线。
很明显,这个算法是一个递归的过程。
好了,我们直接来看代码,首先我们先来看-排列,
void dfs(int index)
{
if (index==k+1)//=================a
{
for (int i=1;i<=k;i++)
cout<<result[i]<<" ";
cout<<endl;
return ;
}
for (int i=1;i<=n;i++)
{
if (!visited[i] )//=========b
{
result[index] = i;
visited[i] = true;//=========c
dfs(index+1);//===========d
visited[i] = false;//=========e
}
}
}
a处注释,为什么index==k+1,而不是index==k
如果index==k,其实result数组里的下标并没有到k,而是k-1
b处注释,这个地方 !visited[i]里面保存的是 走过的节点情况,下标代表节点。
c处注释,已