題目描述
排列,一般地,從n個不同元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列(Arrangement)。特別地,當m=n時,這個排列被稱作全排列(Permutation)。
現給一個正整數( 1 < = n < = 8 ),輸出所有全排列。
例如n=3,輸出所有組合,並且按字典序輸出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
每個全排列一行,相鄰兩個數用空格隔開(最后一個數后面沒有空格)
輸入
輸入一個整數n
輸出
輸出所有的全排列,每個排列占一行,同一個排列中,兩個數之間用一個空格隔開。
樣例輸入
3
樣例輸出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Source Code
#include <iostream>//頭文件
#include <string.h>//
using namespace std;//
bool used[10];//這個組合曾經有過(是否重復)
int ans[10];//排列出來的數
int n;//
void dfs(int u)//dfs函數
{
if(u == n + 1)//如果滿足3個數據,則輸出
{
for (int i = 1;i <= n;i ++)//
printf("%d ",ans[i]);//ans[i]就是輸出數據里面的第i個
printf("\n");
return ;
}
for (int i = 1;i <= n;i ++)
if(used[i] == 0)//如果i沒有被選中
{
ans[u] = i;//如果沒有被選中,就把i放到ans[]中
used[i] = 1;//used[2] = 1表示2這個數已經被選過了 used[3] = 1表示3這個數已經被選過了
dfs(u + 1);//繼續選下一個數字 dfs(1):選第1個數 dfs(2):選第2個數 dfs(n + 1):打印,退出
used[i] = 0;//打印完畢,把該數字取消
}
}
int main()
{
memset(used,0,sizeof(used));
cin >> n;
dfs(1);
return 0;
}