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

2022-05-20 19:59:27 字數 1201 閱讀 1120

´問題描述:

設 r=是要進行排列的 n 個元素。其中元素 n

r ,r , ,r 1 2  可能相同。試設計

乙個演算法,列出 r 的所有不同排列。

´程式設計任務:

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

´資料輸入:

由檔案 input.txt 提供輸入資料。檔案的第 1 行是元素個數 n,1£n£500。接下來的 1 行

是待排列的 n 個元素。

´結果輸出:

程式執行結束時,將計算出的 n 個元素的所有不同排列輸出到檔案 output.txt 中。檔案

最後 1 行中的數是排列總數。

輸入檔案示例 輸出檔案示例

input.txt output.txt

4aacc

aacc

acac

acca

caac

caca

ccaa

6【題解】

列舉當前位置要放的數字是什麼然後和長度為len-1的排列接在一起成為長度為len的排列。

這種搜的方法的確更優秀點。

因為可以在搜的時候就把重複的數字直接排除掉。

設當前要確定的位置是l.

然後列舉其要和後面某個位置交換。

假設是i.

則我們只要看看l..i-1這個區間裡面的數字有沒有和a[i]相同的就可以了。

如果有相同的。那麼之前肯定已經考慮過了(因為i是順序列舉的).則直接跳過就行。

以前我寫的排列的方法要把所有的排列全都列出來。

事實上那樣

20aaaa.aa(20個a)

這樣的情況就不能很快解決了

而這樣的列舉方法可秒出解

【**】

#include #include using namespace std;

const int n = 10;

int n,cnt;

char s[n+10];

templatebool ok(type a,int l,int cur)

}return true;

}templatevoid doit(type a,int l,int r)

puts("");

return;

}for (int k = l;k <= r;k++)

}}int main()

有重複元素的排列問題

源 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...

有重複元素的排列問題

問題描述 設r 是要進行排列的n個元素。其中元素r1,r2 rn可能相同。試設計乙個演算法,列出r的所有不同排列。程式設計任務 給定n 以及待排列的n 個元素。計算出這n 個元素的所有不同排列。輸入格式 檔案的第1 行是元素個數n,1 n 500。接下來的1 行是待排列的n個元素。輸出格式 計算出的...

有重複元素的排列問題

題目描述 設r 是要進行排列的n個元素。其中元素r1,r2 rn可能相同。試設計乙個演算法,列出r的所有不同排列。給定n 以及待排列的n 個元素。計算出這n 個元素的所有不同排列。輸入輸入資料的第1 行是元素個數n,1 n 500。接下來的1 行是待排列的n個元素。輸出計算出的n個元素的所有不同排列...