把 1~n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。
輸入格式
一個整數n。
輸出格式
按照從小到大的順序輸出所有方案,每行1個。
首先,同一行相鄰兩個數用一個空格隔開。
其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。
數據範圍
1≤n≤9
輸入樣例:
3
輸出樣例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
/*
主要思想:第一個位置枚舉每一個數字,再枚舉第二個位置,以此類推,以此枚舉,直到最後一個位置
*/
#include <cstdio>
#include <iostream>
using namespace std;
int n;
int num[10];//0-沒有用下標的數字,1-使用了下標的數字
int out[10];//下標代表位置,數字代表這個位置上的數字
void dfs(int index)
{
if(index == n)//枚舉到最後一個數字完成,輸出
{
for(int i = 0;i < n; i++)
{
printf("%d ",out[i]);
}
printf("\n");
return;
}
for(int i = 0; i < n; i++)
{
if(num[i] == 0)//這個數字沒有使用
{
num[i] = 1;//使用這個數字
out[index] = i+1;
dfs(index+1);//對下一個位置進行枚舉
num[i] = 0;//恢復現場
}
}
}
int main()
{
scanf("%d",&n);
dfs(0);//從第一個位置開始
return 0;
}