DFS入门篇---蓄势待发!

来源:互联网 发布:趣图软件下载 编辑:程序博客网 时间:2024/06/04 00:56
深度优先搜索(DFS,Depth-First-Search)是搜索的手段之一。不断的向所有可能的状态转移直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。掌握DFS对于OIers来说就像战场上的士兵会开枪一样是基本技能而不是制胜法宝......Let's start the first step!


全排列生成算法

简介:从n个元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列,A(n,n)= n !。

下面以生成1~n的自然数的全排列为例,介绍DFS递归算法,按照字典序输出:

1,不断地从1~n中选取第一个没有被使用过的数,放入一个数组中储存。

2,不断重复第1步,直到n个数都选完了,输出数组中的一组排列,同时退回上一步。


事实上,STL的bool next_prmutation(first iterator,last iterator),生成当前排列字典序的下一个排列,成功返回true,通过他也能生成全排列


#include<bits/stdc++.h>using namespace std;bool is_v[20]={0};int m[20],n;//输出保存的一组排列 void Pm(void){for(int g=0;g<n;g++) printf("%d ",m[g]);putchar('\n');}//正在考虑第i个数,打算填入num void dfs(int i,int num){if(i==n){Pm();return;}is_v[num]=1;//记这个数已使用过 for(int p=1;p<=n;p++){if(is_v[p]==0){m[i]=p;//放入数组m中储存 dfs(i+1,p);//下一个 } }is_v[num]=0;//所有以num开头的可能都试过了,复位并回到上一步 }int main(){scanf("%d",&n);dfs(0,0);return 0;}

原创粉丝点击