zoukankan      html  css  js  c++  java
  • 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("
    ");
                    else
                        printf(" ");
                }
            }
            printf("
    %d
    ",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;
    }
    

      

  • 相关阅读:
    Java 线程池学习
    Java线程:新特征-线程池
    创建Java线程池
    JAVA-线程安全性
    java线程安全总结
    栈和队列
    历年题目
    蓝桥杯算法训练
    hdu2083 暴力水
    poj 2299
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4844179.html
Copyright © 2011-2022 走看看