逐一分析每个位置可以填哪些数
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 10;
int st[N];//当前的状态 0表示还没放 1~n表示放了对应的数
bool used[N];//存i有没有被用过 false表示没有用过
int n;
void dfs(int u)
{
//所有位置全部填完
//开始输出
if (u > n)
{
for (int i = 1;i <= n;i++)
printf("%d ", st[i]);
cout << endl;
return;
}
//依次枚举当前层可以往下拓展的每一个分支
//即当前位置可以填哪些数
for (int i = 1;i <= n;i++)
{
//当前数i没有被用过
if (!used[i])
{
st[u] = i;
used[i] = true;
dfs(u + 1);
//从下层回来时
//恢复现场 便于同层下一分支的搜索
st[u] = 0;
used[i] = false;
}
}
}
int main()
{
cin >> n;
dfs(1);
return 0;
}