Uva 129 Krypton Factor

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva 129 Krypton Factor相关的知识,希望对你有一定的参考价值。

0.这道题的输出 处理起来挺麻烦的

以后类似的可以借鉴一下

for(int i=0;i<cur;i++)
        {
            if(i!=0 && i%64==0)
                printf("\n%c",a[i]);
            else if(i!=0 && i%4==0)
                printf(" %c",a[i]);
            else
                printf("%c",a[i]);
        }

1.还有一个是输出 第n小  怎么来控制第n小   利用的是一个初始化为0的cnt  每当满足所有条件 进入递归边界的时候 判断一下cnt是否等于n 然后cnt++ 

  初始化为0的原因是 第一次在主函数中调用的时候 执行判断语句 cnt++ == n的时候 cnt就更新为1了,所以是初始化为0而不是1.

2.是判断是否是简单的串的方法

这是一个由前L个字符组成的字符串,所以有一个i<l的for循环和  a[cur]=‘A‘+i;的语句

int ok为1 表示困难串,因为 判断完之后是困难串,才进入递归dfs

之后,我们是判断后缀是否相同,而不是整个字符串拿来判断,那样会做很多重复的工作导致效率下降。

  初始化isequal=1,然后开始判断,一旦发现不等的,就isequal=0然后break

在循环外面 判断 if(isequanl==1)  如果是1  则是简单串 则ok=0;

如果ok==1  则进入递归  就是这样一个逻辑

for(int i=0;i<l;i++)
    {
        a[cur]=A+i;
        int ok=1;
        for(int j=1;j*2<=cur+1;j++)
        {
            int isequal=1;

            for(int k=0;k<j;k++)
                if(a[cur-k]!=a[cur-j-k])
                    {isequal=0;break;}

            if(isequal==1)
            {
                //如果是简单串 则ok=0;
                ok=0;break;
            }
        }
        if(ok==1 && getans==false) dfs(cur+1);
    }

 

3.   得到答案之后记得更新getans 为true  终止剩下的dfs 不然会一直输出

 或者  dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出!!!  使用int型的dfs  找到答案后return 0    其余dfs均return 1  

if(ok) if(!dfs(cur+1)) return 0;

 

 1 #include <cstdio>
 2 int n,l,cnt;
 3 char a[90];
 4 bool getans;
 5 void dfs(int cur)
 6 {
 7     if(cnt++ == n)
 8     {
 9         getans=true;
10         for(int i=0;i<cur;i++)
11         {
12             if(i!=0 && i%64==0)
13                 printf("\n%c",a[i]);
14             else if(i!=0 && i%4==0)
15                 printf(" %c",a[i]);
16             else
17                 printf("%c",a[i]);
18         }
19         printf("\n");
20 
21         printf("%d\n",cur);
22     }
23     for(int i=0;i<l;i++)
24     {
25         a[cur]=A+i;
26         int ok=1;//ok=1表示困难的串
27         for(int j=1;j*2<=cur+1;j++)
28         {
29             int isequal=1;
30 
31             for(int k=0;k<j;k++)
32                 if(a[cur-k]!=a[cur-j-k])
33                     {isequal=0;break;}
34 
35             if(isequal==1)
36             {
37                 //如果是简单串 则ok=0;
38                 ok=0;break;
39             }
40         }
41         if(ok==1 && getans==false) dfs(cur+1);
42     }
43 }
44 int main()
45 {
46     while(scanf("%d%d",&n,&l)!=EOF)
47     {
48         if(n==0 && l==0) break;
49         getans=false;
50         cnt=0;
51         dfs(0);
52     }
53 
54     return 0;
55 }

 

以上是关于Uva 129 Krypton Factor的主要内容,如果未能解决你的问题,请参考以下文章

Uva 129Krypton Factor(困难的串)

Uva-129 Krypton Factor

UVA129-Krypton Factor(搜索剪枝)

UVa129 Krypton Factor (回溯法)

UVa 129 Krypton Factor (DFS && 回溯)

UVa1628