UVa 129 (回溯法) Krypton Factor

回溯法确实不是很好理解掌握的,学习紫书的代码细细体会。

 1 #include <cstdio>
 2
 3 char S[100];
 4 int n, L, cnt;
 5
 6 int dfs(int cur)
 7 {
 8     if(cnt++ == n)
 9     {
10         for(int i = 0; i < cur; ++i)
11         {
12             if(i % 64 == 0 && i) puts("");
13             else if(i % 4 == 0 && i) printf(" ");
14             printf("%c", ‘A‘ + S[i]);
15         }
16         printf("\n%d\n", cur);
17         return 0;
18     }
19     for(int i = 0; i < L; ++i)
20     {
21         S[cur] = i;
22         int ok = 1;
23         for(int j = 1; j*2 <= cur + 1; ++j)
24         {
25             int equal = 1;
26             for(int k = 0; k < j; ++k)
27                 if(S[cur-k] != S[cur-k-j]) { equal = 0; break; }
28             if(equal) { ok = 0; break; }
29         }
30         if(ok) if(!dfs(cur+1)) return 0;
31     }
32     return 1;
33 }
34
35 int main()
36 {
37     while(scanf("%d%d", &n, &L) == 2 && n)
38     {
39         cnt = 0;
40         dfs(0);
41     }
42
43     return 0;
44 }

代码君

时间: 2024-10-03 02:55:03

UVa 129 (回溯法) Krypton Factor的相关文章

uva 129 回溯法入门

题意:给出n,l:要求按特定格式输出由前l个大写字母构成的按字母表排列的第n个没有连续重复子串的字符串以及该字符串长度. 1.避免相邻的重复子串:生成字符串方式为逐个在后面添加字符,只要每次在添加字符后检查与新添加的字符相关的字符串时候满足条件即可. 2.要求按字母表顺序生成子串:从A开始,逐个向后生成.每次添加字母后若满足条件,继续从A开始添加字母:若不满足条件,返回上一级(回溯). 3.生成的子串数达到给定的数量n后,退出程序(若调用的函数有返回值,则返回特定值0,或1). #include

Krypton Factor 困难的串-Uva 129(回溯)

原题:https://uva.onlinejudge.org/external/1/129.pdf 按照字典顺序生成第n个“困难的串” “困难的串”指的是形如ABAB, ABCABC, CDFGZEFGZE的串,它们都有相邻的重复子字符串 字母的范围是L,既 'A'到'A' + L 分析: 大体上这是一道生成排列组合的题.难点在于我们如何判断当前生成的串是"困难的串" 我们首先采用递归按照字典顺序从小到大生成串, 那么每一次我们处理的都是前一个"困难的串", 既满足

[2016-02-19][UVA][129][Krypton Factor]

UVA - 129 Krypton Factor Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description You have been employed by the organisers of a Super Krypton Factor Contest in which contestants have very high mental and physica

【Uva 129】Krypton Factor(困难的串)

You have been employed by the organisers of a Super Krypton Factor Contest in which contestantshave very high mental and physical abilities. In one section of the contest the contestants are tested ontheir ability to recall a sequenace of characters

129 - Krypton Factor(dfs回溯)

回溯法的再次利用,体会精妙之处. 多研究,多做题~~ #include<bits/stdc++.h> using namespace std; int n,L,cnt,s[100]; int dfs(int cur) { if(cnt++==n) { int kase=0,ans=0,ens=0; for(int i=0;i<cur;i++){ printf("%c",'A'+s[i]); kase++; ens++; if(kase==4) { kase=0; an

UVA - 524 Prime Ring Problem(dfs回溯法)

UVA - 524 Prime Ring Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers  into each circle separately, and the sum of number

UVA - 524 Prime Ring Problem(素数环)(回溯法)

题意:输入n,把1~n组成个环,相邻两个数之和为素数. 分析:回溯法. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<s

UVa 331 交换的方案数 (回溯法,启发)

题意:只能交换相邻的数.要把一个数组这样交换以形成升序.问最少交换次数的不同交换顺序有多少种. 思路:还是没想到,看到别人题解中一句话,茅塞顿开:每次从头选两个需要交换的位置进行交换.只有降序才需要交换,而且可以看到每次降序的调换都是有意义的.这样每次从头找一个需要交换的位置,就是不同的方案.当某次从头扫描到尾没有需要交换的位置时,则已经排好序,就是交换次数,用一个flag变量标志. 0.022s,还好,就没有剪枝优化.这题还是可以剪枝的. 这题对回溯法的应用和思路很有启发意义~ Code: #

UVA129 Krypton Factor

问题链接:UVA129 Krypton Factor. 问题简述:题目是氪因子.输入正整数n和L,输出由前L个字符组成的.字典顺序第n小的不含相邻重复字串的字符串.不含相邻重复字串的字符串是指,一个字符串中,任意两个相邻的字串都不相等.输出结果时,对于找到的字符串,每4个字符间加入一个空格,每行输出80个字符. 问题分析:回溯法实现.从第1个字符开始试探,每个字符从"A"开始可以是L个字符之一,直到遇见第n个满足条件的字符串.试探过程中,当前的串是不包含相邻相同子串的,所以只需要考虑加