【問題描述】
設 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...