数字的全排列
思路:DFS深度搜索
模拟
清晰思路:
DFS的核心在于深度遍历与回溯,在返回上一层后需要恢复现场。
#include<iostream>
using namespace std;
int n;
const int N = 10010;
int path[N];//path 0-n-1 存放排列数字
bool state[N];//存放每个数字的使用状态 true表示使用了 false表示没使用过
void dfs(int u)
{
if(u == n)//一个排列填充完成
{
for(int i = 0;i < n;++i)
{
cout << path[i] << " ";
}
cout << endl;
return;
}
for(int i = 1;i <= n;++i)//遍历可用数字
{
if(!state[i]) //如果当前数字i没有备用
{
path[u] = i; //将i填充在数字排列的位置上
state[i] = true; //i已经被用
dfs(u+1); //这个位置的数填好 递归到右面一个位置
state[i] = false;//回溯,当下一层返回至此时,将i变为可用
}
}
// for 循环全部结束了 dfs(u)才全部完成 最终回溯
return; // 可写可不写
}
int main()
{
cin >> n;
dfs(0);// 在path[0]处开始填数
return 0;
}