找到一种方法,按字典顺序生成字母表中前n个字母的所有排列,但忽略具有两个彼此相邻的人声的结果。
我试过了,但是对于某些测试用例来说似乎是错误的,而且在其他情况下也很慢,因此我无法确定它是否适用于这些用例。它仅适用于少数情况。.
输入:
4
输出
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba
#include <bits/stdc++.h>
using namespace std;
int n;
bool verify(char sir[9]) {
char v[] = "aeiou";
for (int i = 1; i < n; ++i) {
char *p = strchr(v, sir[i]);
if(p != 0) {
p = strchr(v, sir[i - 1]);
if(p != 0)
return 0;
}
}
return 1;
}
int main() {
int lg = 0;
char sir[9];
cin >> n;
for (char c = 'a'; c < 'a' + n; ++c) {
sir[lg] = c;
++lg;
}
do {
if(verify(sir)) {
for (int i = 0; i < n; ++i)
cout << sir[i] << ' ';
cout << '\n';
}
} while(next_permutation(sir, sir + n));
return 0;
}