困难串

/*困难串(无两个相邻的重复字串)*/
#include <iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define maxn 1000
int cnt,n,L;
int S[maxn];
int dfs(int cur)//返回0表示已经得到解,无须继续搜索
{
    int i,ok,j,k,equals;
    if(cnt++==n)//输出方案
    {
        for(i=0; i<cur; i++)
            printf("%c",'A'+S[i]);
        printf("
");
        return 0;
    }
    for(i=0; i<L; i++)
    {
        S[cur]=i;
        ok=1;
        for(j=1; 2*j<=cur+1; j++) //尝试长度为j*2的后缀
        {
            equals=1;
            for(k=0; k<j; k++)
                if(S[cur-k]!=S[cur-k-j])//检查后一半是否等于前一半
                {
                    equals=0;
                    break;
                }
            if(equals)//递归搜索,如果找到解,则直接退出
            {
                ok=0;
                break;
            }
        }
        if(ok)
            if(!dfs(cur+1))
                return 0;
    }
    return 1;
}
int main()
{
    while(~scanf("%d%d",&n,&L))
    {
        cnt=0;
        dfs(0);
    }
    return 0;
}
/*输出由前L个字符组成的,字典序第n小的困难的串*/
原文地址:https://www.cnblogs.com/heqinghui/p/3205573.html