用n个不同的字符(编号1 - n),组成一个字符串,有如下2点要求:
1、对于编号为i的字符,如果2 * i > n,则该字符可以作为最后一个字符,但如果该字符不是作为最后一个字符的话,则该字符后面可以接任意字符;
2、对于编号为i的字符,如果2 * i <= n,则该字符不可以作为最后一个字符,且该字符后面所紧接着的下一个字符的编号一定要大于2 * i。
问:有多少长度为M且符合条件的字符串。
例如:N = 2,M = 3。则abb,bab,bbb是符合条件的字符串。剩下的均为不符合条件的字符串。
#define N 4
#define M 5
void findValidStr(char* elems, char* result, int pos) {
if (pos == M) {
result[M] = '\0';
puts(result);
} else {
if (pos == 0) {
int i = pos;
for (i = pos; i < N; i++) {
result[pos] = elems[i];
findValidStr(elems, result, pos + 1);
}
} else {
int i = 0;
int lastI = result[pos - 1] + 1 - 'a';
if (lastI * 2 <= N) {
i = lastI;
}
if (pos == M - 1) {
if (i != lastI) {
i = N / 2;
}else if(2*i<=N)
{
i = N / 2;
}
}
for (; i < N; i++) {
result[pos] = elems[i];
findValidStr(elems, result, pos + 1);
}
}
}
}