算法1
思路:递归,感觉这类排列枚举问题就是递归的思路,一个套路模板就是
void dfs(int u,int state)
{
if(u==n)//套路一:这里表示把所有数枚举完
{
for(int i=0;i<n;i++)//套路二:遍历所有数
{
//里面一般是cout<<i啊,什么x啊
}
for(auto x:path)//这里也是枚举所有,一般在vector中用的比较多
{
}
}
//套路模板三:dfs(u+1,state),不选当前u,dfs(u+1,state<<1&u)
//或者遍历所有数,基本都会常见的一个state<<i&1,得到个位
}
C++ 代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> path;//记录全排列的顺序
int n;
void dfs(int u,int state)
{
if(u==n)//如果把所有数都枚举完了
{
for(auto x:path)cout<<x<<' ';
cout<<endl;
return;
}
//遍历一遍,如果个位是0,说明还没有枚举过
for(int i=0;i<n;i++)
{
if(!(state>>i&1))
{
path.push_back(i+1);//将下一个数放到数组里
dfs(u+1,state|1<<u);//进行递归
path.pop_back();//恢复现场
}
}
}
int main(){
cin>>n;
dfs(0,0);
return 0;
}