原题链接:可重排列 - 题目 - Daimayuan Online Judge
解题思路:本题只需要先对输入的字符按字典序最小的方式排序(其实如果按顺序从1开始对字符串赋值,本身已经是字典序最小了),再不断利用next_permutation排序逐渐向字典序更大的情况遍历每一种可能的排序方式即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
string s;
long long n, p[11],sum;
int main(){
cin >> n;
for (int i = 1; i <= n;i++){//输入
scanf("%lld", &p[i]);
sum += p[i];
}
for (int i = 1; i <= n;i++){//对字符串按照要求进行初始化
for (int j = 0; j < p[i];j++){
s += (char)(i + '0');
}
}
do{
for (int i = 0; i < sum;i++){
printf("%c", s[i]);
if(i!=sum-1)
printf(" ");//不要忘记输出空格
}
printf("\n");
} while (next_permutation(s.begin(), s.end()));//每次循环都让字典序变得相邻的更大的情况,如果字典序已为最大则会返回false,退出循环
cin >> n;
return 0;
}