# 全排列问题
## 题目描述
按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
## 输入格式
一个整数 n。
## 输出格式
由1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个场宽。
## 样例 #1
### 样例输入 #1
3
### 样例输出 #1
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
## 提示
1≤n≤9。
##分析&题解
此题可以用搜索来解,
在符合条件时输出排列,
同时还要回溯
AC代码
#include<bits/stdc++.h>//万能头文件
using namespace std;//使用标准命名空间
const int maxn=10002;
int a[maxn],n;//a[]是全排列的各项数,n的意义依题意
bitset<maxn>bs;//相当于又建了一个大小等同于a的数组
void f()
{
if(bs.count()==n)//bs.count可以判断排列数量是否已经等于n了
{
for(int i=1;i<=n;i++)//从第一个数开始依次输出
{
cout<<setw(5)<<a[i];//输出之间设置5个场宽
}
cout<<endl;//输出空格
return;//返回
}
for(int i=1;i<=n;i++)
{
if(!bs[i])//bs[i]没有出现过
{
bs[i]=1;//将其设置为1,表示已经出现过了
a[bs.count()]=i;//第[已经填过数的总数]个数的值设置为i
f();//继续搜索
bs[i]=0;//回溯
}
}
}
int main()
{
bs.reset();//将其清零
cin>>n;//输入
f();调用函数
return 0;
}