可重排列 - 题目 - Daimayuan Online Judge
很开心能够独立做出这题,刚开始看题目的时候就看出了用dfs全排列,但是由于对dfs不是很熟悉,一开始不知道从何下手
由于有之前类似题目的经验,我开始回顾之前的做法,然后就AC了
类似题目(有详解)见第十届蓝桥杯c++b组_沫刃起的博客-CSDN博客https://blog.csdn.net/m0_74087709/article/details/129890722
用map来记录每个数的个数
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
const int N=1e5+10;
map<int,int>mp;
int n;
int sum;
int st[N];
void dfs(int u){
if(u==sum+1){
for(int i=1;i<=sum;i++) cout<<st[i]<<" ";
cout<<endl;
}
else{
for(int i=1;i<=n;i++){
if(mp[i]){
st[u]=i;
mp[i]--;
dfs(u+1);
mp[i]++;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
sum+=x;
mp[i]=x;
}
dfs(1);
return 0;
}