UVA129 Krypton Factor

问题链接UVA129 Krypton Factor

问题简述:题目是氪因子。输入正整数n和L,输出由前L个字符组成的、字典顺序第n小的不含相邻重复字串的字符串。不含相邻重复字串的字符串是指,一个字符串中,任意两个相邻的字串都不相等。输出结果时,对于找到的字符串,每4个字符间加入一个空格,每行输出80个字符。

问题分析:回溯法实现。从第1个字符开始试探,每个字符从"A"开始可以是L个字符之一,直到遇见第n个满足条件的字符串。试探过程中,当前的串是不包含相邻相同子串的,所以只需要考虑加入一个字符之后,是否变为包含相邻相同子串。

程序说明:函数check()用于检查一个串是否有相邻的相等的子串,如果没有则返回true,否则返回false。

AC的C++语言程序如下:

/* UVA129 Krypton Factor */

#include <iostream>

using namespace std;

const int MAXN = 80;

int n, l, count;
char v[MAXN+1];

// 判定是否有相邻的重复子串:只需要考虑追加1个字符后是否产生相邻重复子串
bool check(int curr)
{
    for(int i=1; i<=(curr + 1) / 2; i++) {
        bool equal = true;
        for(int j=0; j<i; j++)
            if(v[curr - i - j] != v[curr - j]) {
                equal = false;
                break;
            }
        if(equal)
            return false;
    }

    return true;
}

void output_result(int curr)
{
    for(int i=0; i<=curr; i++) {
        if(i % 4 == 0 && i > 0) {
            if(i % 64 == 0 && i > 0)
                putchar('\n');
            else
                putchar(' ');
        }
        putchar(v[i]);
    }
    printf("\n%d\n", curr+1);
}

// 对于第curr字符,从‘A’到第l个字母都试探一遍
int dfs(int curr)
{
    for(int i=0; i<l; i++) {
        v[curr] = 'A' + i;
        if(check(curr)) {
            if(++count == n) {
                v[curr + 1] = '\0';
                output_result(curr);
                return 1;
            } else if(dfs(curr + 1))
                return 1;
        }
    }

    return 0;
}

int main()
{
    while(cin >> n >> l) {
        if(n == 0 && l == 0)
            break;

        count = 0;
        dfs(0);
    }

    return 0;
}
时间: 2024-12-17 13:43:47

UVA129 Krypton Factor的相关文章

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

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;

[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

Krypton Factor

Krypton Factor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 181    Accepted Submission(s): 60 Problem Description You have been employed by the organisers of a Super Krypton Factor Contest in

【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

HDU 1627 Krypton Factor

回溯法:避免无用判断,强化回溯代码的实现过程 题目的大意就是以字典序为准,排列字符串,但要保证一个字符串中不包含相邻的重复子串. Problem Description For example, the sequence ABACBCBAD is easy, since it contains an adjoining repetition of the subsequence CB. Other examples of easy sequences are: BB ABCDACABCAB AB

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

UVa 129 Krypton Factor【回溯】

学习的紫书的回溯,理解起来还是好困难的说啊= = 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #includ

hdu - 1627 Krypton Factor (dfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1627 给定 n 和 L 找出第n个范围在0-L之内的字符串,字符串要求没有相邻的子串是相同的. 按照格式输出. 这个题的关键在于判断字符串是否是符合要求的字符串. 枚举字符串所有子串可能的长度,然后判断即可. #include <iostream> #include <cstdio> #include <cmath> #include <vector> #include