全排列問題 題解

2021-09-11 08:46:13 字數 2022 閱讀 9603

題目描述

從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。

輸入輸入乙個正整數n(n<10)

輸出以字典序給出這n個整數能形成的所有排列,每一行乙個排列

示例輸入

3示例輸出

123132

213231

312321

**:#include#include#includeusing namespace std;

int result[1000000],l=0;//全域性變數陣列result儲存排序結果

void swap(int &a,int &b)

void perm(int num,int start,int end,int oldstart,int oldend)

result[l]=number;

l=l+1;

} else//繼續交換元素位置進行排列 }

}int main()

{ int n;

cin>>n;

int num[n];

for(int i=0;i【注意:依照舉例,題目要求排列結果從小到大輸出】

【如果不用result陣列把排列結果按數字形式記錄再排序後輸出,而是直接在perm函式的判斷start=?end時直接依次輸出元素,不能保證從小到大輸出】

使用遞迴,perm函式對陣列num的start和end區段進行遞迴操作。

輸入 3 過程舉例:

初始num 1 2 3 start=0,end=2

進入perm函式

判斷start≠end,進入for迴圈①,逐個交換至陣列第乙個位置

(對123,1和1交換)num 1 2 3 呼叫perm函式 start=1,end=2

判斷start≠end,進入for迴圈②

(對23,2和2交換)num 1 2 3 呼叫perm函式 start=2,end=2

判斷start=end,計算此時排列結果為數字1 2 3

繼續迴圈②

(對23,3和2交換)num 1 3 2 呼叫perm函式 start=2,end=2

判斷start=end,計算此時排列結果為數字1 3 2

迴圈②一輪結束,交換回去num 1 2 3

迴圈②結束,繼續迴圈①

(對123,2和1交換)num 2 1 3 呼叫perm函式 start=1,end=2

判斷start≠end,進入for迴圈③

(對13,1和1交換)num 2 1 3 呼叫perm函式 start=2,end=2

判斷start=end,計算此時排列結果為數字2 1 3

繼續迴圈③

(對13,3和1交換)num 2 3 1 呼叫perm函式 start=2,end=2

判斷start=end,計算此時排列結果為數字2 3 1

迴圈③一輪結束,交換回去num 1 2 3

迴圈③結束,繼續迴圈①

(對123,3和1交換)num 3 2 1 呼叫perm函式 start=1,end=2

判斷start≠end,進入for迴圈③

(對21,2和2交換)num 3 2 1 呼叫perm函式 start=2,end=2

判斷start=end,計算此時排列結果為數字3 2 1

繼續迴圈③

(對21,1和2交換)num 3 1 2 呼叫perm函式 start=2,end=2

判斷start=end,計算此時排列結果為數字3 2 1

迴圈③一輪結束,交換回去num 1 2 3

迴圈③結束

迴圈①結束

對result陣列記錄的排列結果數字按從打到小排列列印即可。

最終結果:

123132

213231

312321

注:如果元素中有重複元素,只需要在遞迴交換當前元素與首元素使該元素作為首元素時,判斷一下是否這個元素已經重複出現過,如果重複則不再交換它對它以後的剩餘元素進行全排列(直接看下乙個元素),如果沒有重複,繼續。

如有錯誤,歡迎指出。

全排列問題 解題報告

全排列問題 解題報告 2015年08月12日 21 04 52 閱讀數 1488 全排列問題 問題描述 輸出自然數1到n所有不重複的排列,即n的全排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入格式 n 1 n 9 輸出格式 由1 n組成的所有不重複的數字序列,每行乙個序列。輸入樣例 3 ...

全排列問題

一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...

全排列問題

題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...