DFS-深度优先搜索
例题都是来自《啊哈!算法》,全排列的代码也是来自该书的(稍微改了一下)
例题一:输出数的全排列
以有6张牌为例,图示说明如下,我前面的那个标记性数组的元素只要前面标记成了true , 后面依次
遍历这个bool数组的时候,只会把false元素放到盒子a里面,所以每次输出不同的牌
而且就是因为你前面的dfs是放在循环里面的,
所以会导致for里面又嵌套了for(其实看图就知道这个图是4层for了,真的恐怖)我个人认为其实还是
有种暴力枚举的意思,只不过就是聪明了一点,利用标记来快速枚举,不会导致重复的现象
代码示例,emm ,需要-std=c++11的命令进行编译,我有点怀念printf了。。
#include <iostream>
using namespace std;
const int MAX = 10;
const int N = 5;
bool book[N];
int a[N + 1];
void dfs(int step)
{
if(step > N)
{
for(int i = 1 ; i <= N ; i++)
{
printf("%d" , a[i]);
}
printf("\n");
return;
}
for(int i = 1 ; i <= N ; i++)
{
if(book[i] == false)
{
a[step] = i;
book[i] = true;
dfs(step + 1);
book[i] = false;
}
}
return;
}
int main()
{
dfs(1);
return 0;
}
例题二:🆗🆗🆗+🆗🆗🆗=🆗🆗🆗
暂时忽略一下里面的ok,其实是填个位数字进去使得等式成立
思想跟上面的也是完全相同,我是吃饭吃着吃着就想到怎么模仿例题一来暴力枚举的
也是一样的思路,没有看过《啊哈!算法》的答案
#include <iostream>
using namespace std;
const int MAX = 10;
bool book[MAX];
int a[MAX];
void dfs(int step)
{
int i;
if(step > 9)
{
int op1 = 100 * a[1] + 10 * a[2] + a[3] ;
int op2 = 100 * a[4] + 10 * a[5] + a[6] ;
int op3 = 100 * a[7] + 10 * a[8] + a[9] ;
if( op1 + op2 == op3)
{
printf("%d + %d = %d\n" , op1 , op2 , op3);
}
return;
}
for(i = 1 ; i <= 9 ; i++)
{
if(book[i] == false)
{
a[step] = i;
book[i] = true;
dfs(step+1);
book[i] = false;
}
}
return;
}
int main()
{
dfs(1);
return 0;
}