
二. 理论

三. 代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=10;
int n;
class Search
{
public:
int path[N];
public:
void initIO()
{
// 关闭输入输出缓存,使效率提升
ios::sync_with_stdio(false);
// 解除cin和cout的默认绑定,来降低IO的负担使效率提升
cin.tie(nullptr);
cout.tie(nullptr);
}
Search()
{
initIO();
fill(path, path+N, 0);
}
/**
* 搜索函数
* @param u 表示当前在第几层,最开始在第0层,当u==n时,说明到达最后一层
* @param state 数字是否已选的状态,二进制位为1表示当前数字已选
*/
void dfs(int u, int state)
{
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-1))&1)==0)//判断i数字是否为1,为1表示已经使用则跳过
{
path[u]=i;//优于每次都是赋值,所以path不用回溯
dfs(u+1, state|(1<<(i-1)));//第二个参数,
// i-1二进制位表示第i个数字,写成参数的形式不用回溯,因为并没有赋值给state
}
}
}s;
int main()
{
cin>>n;
s.dfs(0, 0);
}