UVa129 Krypton Factor (回溯法)

链接:http://acm.hust.edu.cn/vjudge/problem/19665分析:cnt用于统计困难串个数,以串的各个位置为状态DFS,由于要字典序第k小,所以枚举cur位置上的字符时要从小到大,每次DFS考虑当前串的后缀是否有困难串,找到一个困难串则cnt++然后继续递归枚举、回溯,如果找到第k个后打印输出最后一波return。
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 int n, L, cnt, S[100];
 6 bool dfs(int cur) {
 7     if (cnt == n) {
 8         for (int i = 0; i < cur; i++) {
 9             if (i % 64 == 0 && i > 0) cout << endl;
10             else if (i % 4 == 0 && i > 0) cout << " ";
11             cout << (char)(S[i] + ‘A‘);
12         }
13         cout << endl << cur << endl;
14         return true;
15     }
16     for (int i = 0; i < L; i++) {
17         S[cur] = i;
18         bool ok = true;
19         for (int j = 1; j * 2 <= cur + 1; j++) {
20             bool equal = true;
21             for (int k = 0; k < j; k++)
22                 if (S[cur - k] != S[cur - k - j]) {
23                     equal = false;
24                     break;
25                 }
26             if (equal) { ok = false; break; }
27         }
28         if (ok) {
29             cnt++;
30             if (dfs(cur + 1)) return true;
31         }
32     }
33     return false;
34 }
35
36 int main() {
37     while (cin >> n >> L && (n || L)) {
38         cnt = 0;
39         dfs(0);
40     }
41     return 0;
42 }
时间: 2024-10-14 17:32:23

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

UVA129 Krypton Factor

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

uva129 - Krypton Factor 7.4.3 困难的串

  7.4.3困难的串 学习点:dfs加入返回值,递归搜索过程中如果有一个成功,就直接退出 //7.4.3 困难的串 #include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; int n,L; int cnt; char v[81]; bool judge(int cur) { fo

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 &&a

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 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

【LeetCode】回溯法 backtracking(共39题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [10]Regular Expression Matching [17]Letter Combinations of a Phone Number [22]Generate Parentheses (2019年2月13日) 给了一个N,生成N对括号的所有情况的字符串. n = 3 [ "((()))", "(()())", "(

五大常用算法之四:回溯法

(转自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html) 1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 许

[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

回溯法 -数据结构与算法

1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 1.回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解时,往往要使用回溯法. 2.有组织的穷举式搜索:回溯法的基本做法是搜索或者有的组织穷尽搜索.它能避免搜索所有的可能性.即避免不必要的搜索.这种方