例题7-5 困难的串 UVa129

1.题目描述:点击打开链接

2.解题思路:本题利用回溯法解决。根据题意描述,易知在枚举第cur位时,只用检查它添加后该串是否合法,而不必去检查cur之间的串是否合法,因为这一步检查在枚举cur之前早已经做过了。另外,本题的输出比较坑,需要小心。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define N 80+10
int S[N];
int n, L;
int cnt;

int dfs(int cur)
{
	if (cnt++ == n)
	{
		for (int i = 0; i < cur; i++)
		{
			printf("%c", 'A' + S[i]);
			if ((i + 1) % 4 == 0)
			{
				if ((i + 1) % 64 == 0)cout << endl;
				else if (i != cur - 1)putchar(' ');
			}
		}
		if (cur % 64)cout << endl;
		printf("%d\n", cur);
		return 0;//返回0表示已经找到了解
	}
	for (int i = 0; i < L; i++)
	{
		S[cur] = i;
		int ok = 1;
		for (int j = 1; j * 2 <= cur + 1; j++)//枚举后缀的长度(注意不是整个串的长度)
		{
			int equal = 1;
			for (int k = 0; k < j;k++)//检查前缀和后缀是否相等,S[cur-k]是后缀部分,S[cur-k-j]是前缀部分
			if (S[cur - k] != S[cur - k - j]){ equal = 0; break; }
			if (equal){ ok = 0; break; }
		}
		if (ok)if (!dfs(cur + 1))return 0;//如果找到解,直接退出
	}
	return 1;
}
int main()
{
	//freopen("t.txt", "r", stdin);
	while (~scanf("%d%d", &n, &L)&&(n||L))
	{
		cnt = 0;
		memset(S, 0, sizeof(S));
		dfs(0);
	}
	return 0;
}
时间: 2024-10-11 10:34:19

例题7-5 困难的串 UVa129的相关文章

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

7.17dfs例题:困难的串

困难的串:问题描述:如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串,如:BB,ABCDACABCAB,ABCDABCD都是容易的,A,AB,ABA,D,DC,ABDAB,CBABCBA都是困难的. 输入正整数n,L,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串.例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABAn指定为4的话,输出ABAC 思路:由题目得知,困难的串是字符串中包含两个相邻的重复

ACM题目————困难的串

题目描述 如果一个字符串包含两个相邻的重复子串,则称他是“容易的串”,其他串称为"困难的串".例如,BB,ABCDACABCAB,ABCDABCD都是容易的串,而D,DC,ABDAB,CBABCBAD都是困难的串. 输入 输入正整数n和L. 输出 输出由前L个字符串组成的,字典序第k小的困难的串.例如,当L=3时,前7个困难的串分别为A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA.输入保证答案不超过80个字符. 样例输入 7 3 30 3 样例输出 ABACABA

困难的串

如果一个字符串包含两个相邻的重复字串,则称它是"容易的串",其他串称为"困难的串".例如,BB,ABCDACABCAB,ABCDABCD都是容易的,而D,DC,ABDAB,CBABCBA都是困难的.输入正整数n和L,输出由前L个字符组成的,字典序第k小的困难的串.例如,当L=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA.输入保证答案不超过80个字符.样例输入:7 330 3样例输出:ABACABAABACABCAC

困难的串(dfs)

困难的串 题意: 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”.例如,                 BB.ABCDABCD都是容易的串,而D.DC.ABDAD.CBABCBA都是困难的串. 输入正整数n和L,输出由前L个字符组成的.字典序第k个困难的串.例如,当L=3时,前7个困难的串          分别为A.AB.ABA.ABAC.ABACA.ABACAB.ABACABA.输入保证答案不超过80个字符. 样例输入: 7  3 30 3 样例输出:

困难的串(搜索)

如果一个字符串包含包含两个相邻的重复字串,则成为容易的串,否则为困难的串,例如困难的串A,AB,ABAC,ABACA,... 输入n,L,输出由前L个字符组成的,字典序第k小的困难的串. 思路和N皇后问题类似,在判断是否存在重复字串只需判断当前串的后缀,而不是所有子串. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int L,n,s; 5 bool flag=0; 6 char ch[1000

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

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

困难的串的求解

如果一个字符串包含两个相邻重复的子串,则称它是容易的串,如果不含这样的串就称为困难的串.例如:BB,ABCDACABCAB,ABCDABCD都是容易的串,而D,DC,ABDAB,CBABCBA都是困难的串. 输入整数n和 l,输出由前 l 个字符串组成的,字典序为第n小的困难的串,例如,当l=3时,前7个困难的串分别为:A,AB,ABA,ABAC,ABACA,ABACAB,ABACABA输入保证答案不超过80个字符. Sample: input: 7 3 30 3 output: ABACABA

【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