#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=10;
int n;//
int state[N];//记录每个位置的状态 0表述还没放数 1~n表示放了哪个数
bool used[N];//记录每个数的状态看这个数是不是被用过 true表示用过了 false表示还没用过
void dfs(int x)
{
if( x==n )
{
for(int i=0;i<n;i++)
printf("%d ",state[i]);
puts("");//输出回车
return ;
}
//依次枚举每个分支,即当前位置可以填哪些数
for (int i = 1; i <= n; i++)
if(!used[i])
{
state[x] = i;//当前位置放该未用过的数
used[i] = true; //将该放置的数的状态由未用过false变成用过了true
dfs(x+1);
//恢复现场
//state[x] = 0;//回到上一个分支 把此处的位置变成0 还没放数
used[i] = false; //回到上一个分支,把刚放置过的数的状态由用过true变成没用过false
}
}
int main()
{
scanf("%d",&n);
dfs(0);
return 0;
}
递归实现排列型枚举
于 2024-03-17 13:12:26 首次发布