题目:
思路:昨天刚好了解了next_permutation()的使用,写这题刚好又用到了。直接用数组记录所给的c个字母,用next_permutation()进行全排列,然后每次选前l个进行判断(①是否以字典序排列②是否至少1元2辅),符合条件存入数组即可。
代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
bool check(string s) {
int flag_y = 0, flag_f = 0;
for (int i = 1; i < s.size(); i++) //判断是否按字典序
if (s[i] <= s[i - 1])return false;
for (int i = 0; i < s.size(); i++) { //判断是否至少1元2辅
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
flag_y++;
else
flag_f++;
}
if (flag_y >= 1 && flag_f >= 2)return true;
else return false;
}
struct cmp
{
bool operator()(string a, string b) {
return a > b;
}
};
int main() {
int l, c;
string s;
map<string, int>mp;
cin >> l >> c;
vector<string>a(c);
for (int i = 0; i < c; i++)
cin >> a[i];
sort(a.begin(), a.end()); //使用next_permutation()前要记得先排序
priority_queue<string, vector<string>, cmp>q;
do {
s = "";
for (int i = 0; i < l; i++)s += a[i];
if (check(s) && mp[s] == 0) {
q.push(s);
mp[s]++;
}
} while (next_permutation(a.begin(), a.begin() + c));
while (!q.empty()) {
cout << q.top() << endl; q.pop();
}
return 0;
}
ps:值得一提的是,使用next_permutation()前记得要先升序排列数组,prev_permutation()降序排列,不然无法对数组进行完全的全排列,因为这两个函数是对当前的数组进行从小到大(从大到小)排列。