Uva-129 Krypton Factor

本文介绍了一种使用C++实现的算法,用于生成指定长度的回文序列。通过深度优先搜索(DFS)和自定义判断函数,确保生成的序列在给定长度和字符集下不包含任何小于当前长度一半的重复子串。文章提供了完整的代码示例,并展示了如何通过控制台输入设置序列长度和字符集大小。
 1 #include <bits/stdc++.h>
 2 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
 3 using namespace std;
 4 
 5 
 6 const char a[27] = {'A','B','C','D','E','F','G','H','I','J',
 7                     'K','L','M','N','O','P','Q','R','S','T',
 8                     'U','V','W','X','Y','Z'
 9                    };
10 
11 int n,L;
12 int cnt;
13 int s[82];
14 
15 int judge(int cur)
16 {
17     for(int j = 1; j * 2 <= cur + 1; j ++)
18     {
19         int equal = 1;
20         _for(k,0,j)
21         if(s[cur-k]!=s[cur-k-j])
22         {
23             equal = 0;
24             break;
25         }
26         if(equal) return 0;
27     }
28     return 1;
29 }
30 int dfs(int cur)
31 {
32     if(cnt++ == n)
33     {
34         _for(i,0,cur)
35         {
36             if(i && (i%64!=0) && (i%4==0)) printf(" ");
37             if(i && (i%64==0)) printf("\n");
38             printf("%c",a[s[i]]);
39         }
40         printf("\n%d\n",cur);
41         return 0;
42     }
43     _for(i,0,L)
44     {
45         s[cur] = i;
46         if(judge(cur))
47             if(!dfs(cur+1))    return 0;
48     }
49     return 1;
50 }
51 
52 int main()
53 {
54     while(cin >> n >> L && (n || L))
55     {
56         memset(s,0,sizeof(s));
57         cnt = 0;
58         dfs(0);
59     }
60     return 0;
61 }

 

转载于:https://www.cnblogs.com/Asurudo/p/10050302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值