把 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;
}