zoukankan      html  css  js  c++  java
  • UVA129-Krypton Factor(搜索剪枝)

    Problem UVA129-Krypton Factor

    Accept:1959  Submit:10261

    Time Limit: 3000 mSec

     Problem Description

    通过了光明狮子的考验,小渡来到了创界山的第二层。没想到第二层的守护神——火焰凤凰正沉迷于字母游戏,不能自拔!为了尽快得到她的帮助,小渡决定出手帮她解决字母游戏的谜题。 字母游戏规则是这样的:
    一个字母串里包含有两个相邻的重复子串则称为“水串”,否则为“火串”
    例如AA、ABCABC都是"水串",而D、DC、ABDAD、CBABCBA都是“火串"。
    输入正整数L和n,输出由前L个字母组成的、字典序第n个的"火串"。

     Input

    多组输入n和L,1<=L<=26,n>0。输入0 0结束。

     Output

    对于每个输入,输出第n个"火串"。在下一行输出“火串”的长度。你可以假设对于给定的L和n,至少存在n个“火串”。
    由于这样的序列可能非常长,每4个字母分割成一组, 如果有超过16个这样的小组,请为第17组开始新的一行。
    假设最大“火串”长度为80。 例如,当L = 3时,前7个“火串”是:
    A
    AB
    ABA
    ABAC
    ABACA
    ABACAB
    ABACABA

     Sample Input

    7 3
    30 3
    0 0
     
     

     Sample Ouput

    ABAC ABA
    7
    ABAC ABCA CBAB CABA CABC ACBA CABA
    28

    题解:回溯法。当判断下一个字母能否添加进来时,只需判断目前字符串的后缀即可。

    P.S.这个题的输出确实比较坑

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <cstdlib>
     5 using namespace std;
     6 
     7 const int maxl = 100;
     8 int n,L,cnt;
     9 char ans[maxl];
    10 bool ok;
    11 
    12 bool Can_Prune(char *str){
    13     int cur = strlen(str);
    14     for(int i = (cur+1)>>1;i < cur;i++){
    15         int len = cur-i;
    16         int st = i-len;
    17         char tmp[maxl];
    18         strncpy(tmp,str+st,len*sizeof(char));
    19         tmp[len] = 0;
    20         if(!strcmp(tmp,str+i)) return true;
    21     }
    22     return false;
    23 }
    24 
    25 void dfs(char *ss,int cur){
    26     if(ok) return;
    27     for(int i = 0;i < L;i++){
    28         char ch = i+'A';
    29         ss[cur] = ch;
    30         ss[cur+1] = '';
    31         if(cur>0 && Can_Prune(ss)) continue;
    32         cnt++;
    33         if(cnt == n){
    34             ok = true;
    35             int con = 0,len = strlen(ss);
    36             for(int i = 0;i < len;i++){
    37                 printf("%c",ss[i]);
    38                 if(i%4==3 && i!=len-1){
    39                     con++;
    40                     if(con == 16){
    41                         con = 0;
    42                         printf("
    ");
    43                     }
    44                     else printf(" ");
    45                 }
    46             }
    47             printf("
    ");
    48             printf("%d
    ",len);
    49             return;
    50         }
    51         dfs(ss,cur+1);
    52     }
    53 }
    54 
    55 int main()
    56 {
    57     //freopen("input.txt","r",stdin);
    58     //freopen("output.txt","w",stdout);
    59     while(~scanf("%d%d",&n,&L) && (n||L)){
    60         cnt = 0;
    61         ok = false;
    62         memset(ans,0,sizeof(ans));
    63         dfs(ans,0);
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    jquery ajax 后台响应成功,返回正确json但不执行success方法,执行error的问题
    bootstrap轮播组件,大屏幕图片居中效果
    mouseover和mouseout事件在鼠标经过子元素时也会触发
    vertical-align的深入学习
    小技巧
    css字体大小设置em与rem的区别
    子元素的margin-top影响父元素原因和解决办法
    JavaScript随机打乱数组
    JavaScript 获取当月天数
    javaScript 的option触发事件
  • 原文地址:https://www.cnblogs.com/npugen/p/9536052.html
Copyright © 2011-2022 走看看