UVA129-Krypton Factor(搜索剪枝)
Posted npugen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA129-Krypton Factor(搜索剪枝)相关的知识,希望对你有一定的参考价值。
Problem UVA129-Krypton Factor
Accept:1959 Submit:10261
Time Limit: 3000 mSec
Problem Description
通过了光明狮子的考验,小渡来到了创界山的第二层。没想到第二层的守护神——火焰凤凰正沉迷于字母游戏,不能自拔!为了尽快得到她的帮助,小渡决定出手帮她解决字母游戏的谜题。 字母游戏规则是这样的:
一个字母串里包含有两个相邻的重复子串则称为“水串”,否则为“火串”
例如AA、ABCABC都是"水串",而D、DC、ABDAD、CBABCBA都是“火串"。
输入正整数L和n,输出由前L个字母组成的、字典序第n个的"火串"。
Input
多组输入n和L,1<=L<=26,n>0。输入0 0结束。
Output
对于每个输入,输出第n个"火串"。在下一行输出“火串”的长度。你可以假设对于给定的L和n,至少存在n个“火串”。
由于这样的序列可能非常长,每4个字母分割成一组, 如果有超过16个这样的小组,请为第17组开始新的一行。
假设最大“火串”长度为80。
例如,当L = 3时,前7个“火串”是:
A
AB
ABA
ABAC
ABACA
ABACAB
ABACABA
Sample Input
7 3
30 3
0 0
30 3
0 0
Sample Ouput
ABAC ABA
7
ABAC ABCA CBAB CABA CABC ACBA CABA
28
题解:回溯法。当判断下一个字母能否添加进来时,只需判断目前字符串的后缀即可。
P.S.这个题的输出确实比较坑
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 using namespace std; 6 7 const int maxl = 100; 8 int n,L,cnt; 9 char ans[maxl]; 10 bool ok; 11 12 bool Can_Prune(char *str){ 13 int cur = strlen(str); 14 for(int i = (cur+1)>>1;i < cur;i++){ 15 int len = cur-i; 16 int st = i-len; 17 char tmp[maxl]; 18 strncpy(tmp,str+st,len*sizeof(char)); 19 tmp[len] = 0; 20 if(!strcmp(tmp,str+i)) return true; 21 } 22 return false; 23 } 24 25 void dfs(char *ss,int cur){ 26 if(ok) return; 27 for(int i = 0;i < L;i++){ 28 char ch = i+‘A‘; 29 ss[cur] = ch; 30 ss[cur+1] = ‘