把1-n这n个数排成一行后随机打乱顺序,输出所有可能的次序
输入格式:一个整数n
输出格式:按照从小到大(顺序输出所有方案,每行1个)
同一行相邻两个数用空格隔开
对于两个不同的行,对应下标数一一比较,字典序娇小的排在前面
数据范围:1<<n<<9
#include<iostream>
using namespace std;
const int N=10; //数组是从0开始的
int n,i;
int st[N]; //当N=0表示没有放入元素,当N=1-n时,表示放的数
bool used[N]; //表示已用过的数
void f(int k) //传入参数 ,表示当前到第几位
{
if(k>n) //当k成为放入的最后一个数时
{
for(int i=1;i<=n;i++) //输出填完的数
printf("%d",st[i]);
printf("%d\n");
return;
}
for(i=1;i<=n;i++) //依次枚举每个分支,即当前位置可以填写那些数
if(!used[i]) //找出没有用过的数
{
st[k]=i;
used[i]=true; //表示已用过的数
f(k+1); //递归
st[k]=0; //回溯,回到初始状态
used[i]=false; //表示没有用过的数
}
}
int main()
{
scanf("%d",&n);
f(1);
return 0;
}