把 1∼n1∼n 这 nn 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数 nn。
输出格式
按照从小到大的顺序输出所有方案,每行 11 个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围
1≤n≤91≤n≤9
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int N = 10;
int n;
int sta[N]; //用来存数
bool us[N]; //判断第i位数是否使用
void dfs(int u) //u表示判断sta数组第u位存什么数
{
if (u > n)//边界 已全部赋值完毕
{
for (int i = 1; i <= n; i++)
{
printf("%d ", sta[i]);
}
puts(" ");
return;
}
for(int i=1;i<=n;i++)
{
//此时的每一位数是空 false
if (!us[i] ) //循环 使得每都是未存个i放数列中的最小位
{
sta[u] = i; //将数i存到下标位u的位置上,0表示不放
us[i] = true; //将数i标记为已使用过
dfs(u + 1); //进行下一位的判断
//恢复现场
sta[u] = 0;
us[i] = false;
}
}
}
int main()
{
scanf_s("%d", &n);
dfs(1);
return 0;
}