#include<iostream>
using namespace std;
int n;
int book[10] = {0};
int a[10];
void dfs(int index)
{
if(index == n) //递归终止条件
{
for(int i = 0;i < n;i++)
cout << a[i];
cout <<endl;
return ;
}
else
{
for(int i = 1;i <= n;++i)
{
if(!book[i])
{
book[i] = 1;//标记位
a[index] = i;//把符合的数字保存到数组中
dfs(index+1);
a[index] = 0;
book[i] = 0;//还原标记,以便回溯
}
}
}
}
void init()
{
for(int i = 0;i < 9;++i)
book[i] = 0;
}
int main()
{
while(cin >> n)
{
dfs(0);
init();
}
return 0;
}
代码来自:Windsearcher的博客_WindSearcher_CSDN博客
此段代码通过DFS实现全排列
我们可以代入数据去走一遍dfs 便于理解dfs的递归与回溯
如:键入数值2
n=2
主函数进入dfs(0);
进入dfs函数 首先判断的就是是否到终点(这是我们去看代码的顺序)
index=0;
所以没有到终点
进入for循环
i=1
book[1]=1;//表示第一个数被访问了
a[0]=1;//把符合的数字保存在数组中
dfs(index+1);//往更深处搜索
这层搜索index=1;
因为book[1]=1;
所以i=2时才能进入if语句块
book[2]=1;//表示第二个数被访问了
a[1]=2;
dfs(index+1);//进入更深处搜索
这层搜索index=2;
输出所排列的数
return;//回溯到上一个dfs
这层继续执行未执行的语句
a[1]=0;
book[2]=0;
执行完了又回溯上一层
a[0]=0;
book[1]=0;
i=2;
book[2]=1;//标记2被访问了;
a[0]=2;
dfs(index+1=1);
进入更深层搜索
i=1时入if语句块
book[1]=1;//标记1被访问了
a[1]=1;
dfs(index+1=2)
进入更深层搜索
index=2;
输出数据
return回溯上层;
a[1]=0;
book[1]=0;
执行结束回溯上层
a[0]=0;
book[2]=0;
在for循环里 循环结束++i
i=3 已不满足循环条件 退出for循环 退出函数
这就是整个思路