深度搜索模板的套路:
先判断是否达到目标状态
如果达到,判断当前状态是否合法是否计入答案。
未达到,枚举可能的状态,记录本轮选择,进入下一层。
返回后,消除影响。
全排列(DFS)
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int vis[10];//用于标记是否被访问过,0--未访问 1--已访问
int ans[10];//用于存储答案
int n;
void dfs(int step)
{
for(int i = 1; i <= n; i++)
{
if(vis[i] == 0)
{
vis[i] = 1;
ans[step] = i;//将答案存储
if(step < n) //调用递归
dfs(step + 1); //即相当于再一次从头执行一个dfs函数,可以理解为一个嵌套
else
{
for(int i = 1; i <= n; i++){
printf("%d",ans[i]);
if(i != n) //用于控制输出格式
printf(" ");
else
printf("\n");
}
}
vis[i] = 0; //访问完毕返回标记为可访问
//只有当输出了一个结果后才有可能执行
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(vis, 0, sizeof(vis));
dfs(1);
}
return 0;
}
next_permutation方法:
#include <iostream>
#include <algorithm>
using namespace std;
int a[3] = { 1,2,3 };
int main()
{
do
{
cout << a[0] << " " << a[1] << " " << a[2] << endl;
} while (next_permutation(a, a + 3));
return 0;
}
运行结果: