UVA-129 Krypton Factor(回溯)

题目大意:由字母A到Z组成的字符串,其中有两个子串完全相同的叫做容易的串,反之叫困难的串。找出由前L个字母组成的第n个困难的串。

题目分析:简单回溯,不过要判断是否存在重复子串比较棘手。《入门经典》上借鉴八皇后问题,只判断添进字符后是否存在连续子串。具体做法是这样的,以长度为对象枚举以新添进字符为尾巴的子串,看是否重复。

 

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;

int n,k,cnt,path[1000];

void dfs(int cur)
{
    if(cur>81)
        return ;
    if(cnt++==n){
        for(int i=0;i<cur;++i){
            printf("%c",char(path[i]+'A'));
            if(i%4==3&&i!=cur-1){
                if(i%64==63)
                    printf("\n");
                else
                    printf(" ");
            }
        }
        printf("\n%d\n",cur);
        return ;
    }
    for(int i=0;i<k;++i){
        path[cur]=i;
        int flag=1;
        for(int j=1;j*2<=cur+1;++j){
            int ok=1;
            for(int l=0;l<j;++l)
                if(path[cur-l]!=path[cur-l-j]){
                    ok=0;
                    break;
                }
            if(ok){
                flag=0;
                break;
            }
        }
        if(flag)
            dfs(cur+1);
        if(cnt>n)
            return ;
    }
}

int main()
{
    while(scanf("%d%d",&n,&k)&&(n+k))
    {
        cnt=0;
        dfs(0);
    }
    return 0;
}

  

posted @ 2015-09-28 15:46  20143605  阅读(354)  评论(0编辑  收藏  举报