一:题目
计算给定的n个数有多少种排列方式,即求全排列(可能出现重复的元素)
输入格式:
第一行输入数字的数量n(n>2),第二行给出每一个数字。
输出格式:
一个数字,不同排列方式的数量。
输入样例:
3
1 2 2
结尾无空行
输出样例:
3
结尾无空行
二:思路
在全排列的基础上,我将输出的数据存放在set容器当中,这个容器有自动去重功能,故可以最后直接输出这个容器的大小即可;
三:上码
#include<bits/stdc++.h>
using namespace std;
int N;
set<string>s;
void swap(int A[],int i,int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
string printarr(int arr[]){
//将int类型的数据转换成string类型,实现字符串的拼接
stringstream st;
for(int i = 0; i < N; i++){
st << arr[i];
}
string str = st.str();
return str;
}
void perm(int A[],int p,int q){
if(p == q){
string str = printarr(A);
s.insert(str);
}else{
for(int i = p; i <= q; i++){
swap(A,p,i);
perm(A,p+1,q);
swap(A,p,i);
}
}
}
int main(){
cin >> N;
int arr[10];
//输入的单个的数字
for(int i = 0; i < N; i++){
int nums;
cin >> nums;
arr[i] = nums;
}
perm(arr,0,N-1);
cout << s.size();
}