Loading

回溯-uva129

题目链接:https://vjudge.net/problem/UVA-129

题解:

这道题卡了一会儿的时间,一开始最大的问题是如何判断添加了一个字符之后,该字符串是不是一个困难的串,解决办法是:利用两个循环分别取相邻的子串,在第二重循环里,如果有一对字符不满足重合,则它必定不是重复的串,如果第一重循环全部满足的话,这个字符放进去必定是困难的串,这就是第一个问题的解决办法。

除了上面的困难之外,还有两个要注意的地方,第一个就是:这个递归函数,一定要加及时的终止条件,找到第一组满足条件的就不用找了。第二个就是:输出小麻烦,一定要小心。

代码如下:

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define MAXN 100
using namespace std;
typedef long long ll;
char ans[MAXN];
int sumtimes;
int n,L;
int findnThSeq(int cur){
    if(sumtimes++ == n){
        sumtimes--;
        int kase = 0;
        for(int i = 0;i<cur;i++){
            kase++;
            printf("%c",ans[i]);
            if(kase % 4 == 0 && kase != 64 && kase != cur) printf(" ");
            if(kase == 64 && cur != 64)printf("\n");
        }
        printf("\n%d\n",cur);
        return 0;
    }
    else{
        for(int i = 0;i<L;i++){
            int ok = 1;
            ans[cur] =  'A' + i;
            for(int j = 1;j*2 <= cur+1;j++){
                int rignt = 1;
                for(int k = 0;k<j;k++){
                    if(ans[cur - k] != ans[cur-k-j]){
                        rignt = 0;
                        break;
                    }
                }
                if(rignt == 1){
                    ok = 0;
                    break;
                }
            }
            if(ok){
                if(!findnThSeq(cur+1)) return 0;
            }
        }
    }
    return 1;
}



int main(void){
    while(scanf("%d%d",&n,&L) == 2 && n && L){
        sumtimes = 0;
        findnThSeq(0);
    }

    return 0;
}

 

posted @ 2018-12-25 12:55  Doubest  阅读(242)  评论(0编辑  收藏  举报