演算法實現題 2 5 有重複元素的排列問題

2021-10-22 05:42:15 字數 1912 閱讀 5801

【問題描述】

設 r=是要進行排列的 n 個元素。其中元素r1 ,r2 ,…,rn 可能相同。試設計乙個演算法,列出 r 的所有不同排列。

【程式設計任務】

給定n 以及待排列的n 個元素。計算出這n 個元素的所有不同排列。

【輸入格式】

檔案的第1 行是元素個數n,1≤n≤500。接下來的1 行是待排列的n個元素。

【輸出格式】

計算出的n個元素的所有不同排列輸出。檔案最後1行中的數是排列總數。

【輸入樣例】

4

aacc

【輸出樣例】多解

aacc

acac

acca

caac

caca

ccaa

6

直接利用全排列next_permutation函式

#include

bool

next_permutation

(iterator start,iterator end)

當當前序列不存在下乙個排列時,函式返回false,否則返回true

#include

using

namespace std;

intmain()

sort

(a,a+n)

;//排序,使字典序最小

do cout << endl;

count++

;//統計個數

}while

(next_permutation

(a,a+n));

//利用全排列函式

cout << count;

return0;

}

#include

using

namespace std;

intmain()

while

(next_permutation

(a,a+n));

//利用全排列函式

cout << sum;

return0;

}

分治思想:

解題思路:

把str陣列中的字元按字典順序填入a陣列中,判斷是否還存在str陣列中,以數字代表字元(1對應a…)存入a陣列,最後輸出的時候在轉化成字元。一定給要注意**資源,因為每乙個字元不是只有1種位置可以填,還可以填入其他的位置構成不同的排列

#include

#include

#include

using

namespace std;

int f[27]

=;//儲存字元出現的次數

int a[

1000];

//str陣列的字元填入a陣列中進行全排列

int count=0;

//統計排列的個數

char str[

1000];

//儲存輸入的字元

int n;

void

print()

//輸出函式,數字轉化成字元

cout << endl;

}void

dfs(

int t)

//t代表a陣列下標,從1開始 }}

intmain()

dfs(1)

; cout << count;

return0;

}

2 5 有重複元素的排列問題

問題描述 設 r 是要進行排列的 n 個元素。其中元素 n r r r 1 2 可能相同。試設計 乙個演算法,列出 r 的所有不同排列。程式設計任務 給定 n 以及待排列的 n 個元素。計算出這 n 個元素的所有不同排列。資料輸入 由檔案 input.txt 提供輸入資料。檔案的第 1 行是元素個數...

演算法實現(2)有重複元素的排列問題

這個演算法思想其實就是跟全排列的演算法思想類似,主要區別是對重複元素的處理。見ok這個函式。演算法設計 給定n及待排列的n個元素。計算出這n個元素的所有不同排列。以下用c語言實現演算法的 include stdafx.h void perm char list,int k,int m void sw...

有重複元素的排列問題

源 include include include using namespace std long long ans int ok char str,int a int b fscanf ft,d n fscanf ft,s str i ans 0 perm fp,str,0,n 1 fprint...