dfs_困难串

来源:互联网 发布:nginx 模型 编辑:程序博客网 时间:2024/04/27 17:38

/*如果一个字符串包含两个相邻的重复字串,则称它是“容易的串”,其他串称为“困难的串”。例如,BB,ABCDACABCAB,ABCDABCD都是容易的,而D,DC,ABDAB,CBABCBA都是困难的。输入正整数n和L,输出由前L个字符组成的,字典序第k小的困难的串。例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA.输入保证答案不超过80个字符。样例输入:7 330 3样例输出:ABACABAABACABCACBABCABACABCACBACABA*/#include <iostream>#include<algorithm>#include<queue>#include<stack>#include<cmath>#include<string.h>#include<stdio.h>#include<stdlib.h>using namespace std;#define maxn 1000int 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("\n");        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;}



0 0
原创粉丝点击