题目描述
把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数n。
输出格式
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围 1≤n≤9
样例
input
3
output
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,order[20],chosen[20];
//order是记录该位置上的数,chosen记录有没有用过
void dfs(int k)
{
if(k==n+1)
{
for(int i=1;i<=n;i++)
{
cout<<order[i]<<" ";
}
cout<<endl;
return ;
}
//接下来对每一位进行操作,k用来记录当前的位数
for(int i=1;i<=n;i++)
{
if(chosen[i]) continue;//如果这个数被用过了就跳过
else
{
//case 1:选这个数
order[k]=i;
chosen[i]=1
dfs(k+1);//每确定当前位的数之后就继续对下一位进行搜索
//递归的范围就减小1,每一次选和不选都是两种情况,满n位就输出
//case 2:不选这个
chosen[i]=0;
order[k]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}