题目链接:https://vjudge.net/problem/UVA-129

题解:

这道题卡了一会儿的时间,一开始最大的问题是如何判断添加了一个字符之后,该字符串是不是一个困难的串,解决办法是:利用两个循环分别取相邻的子串,在第二重循环里,如果有一对字符不满足重合,则它必定不是重复的串,如果第一重循环全部满足的话,这个字符放进去必定是困难的串,这就是第一个问题的解决办法。

除了上面的困难之外,还有两个要注意的地方,第一个就是:这个递归函数,一定要加及时的终止条件,找到第一组满足条件的就不用找了。第二个就是:输出小麻烦,一定要小心。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define MAXN 100
using namespace std;
typedef long long ll;
char ans[MAXN];
int sumtimes;
int n,L;
int findnThSeq(int cur){
if(sumtimes++ == n){
sumtimes--;
int kase = ;
for(int i = ;i<cur;i++){
kase++;
printf("%c",ans[i]);
if(kase % == && kase != && kase != cur) printf(" ");
if(kase == && cur != )printf("\n");
}
printf("\n%d\n",cur);
return ;
}
else{
for(int i = ;i<L;i++){
int ok = ;
ans[cur] = 'A' + i;
for(int j = ;j* <= cur+;j++){
int rignt = ;
for(int k = ;k<j;k++){
if(ans[cur - k] != ans[cur-k-j]){
rignt = ;
break;
}
}
if(rignt == ){
ok = ;
break;
}
}
if(ok){
if(!findnThSeq(cur+)) return ;
}
}
}
return ;
} int main(void){
while(scanf("%d%d",&n,&L) == && n && L){
sumtimes = ;
findnThSeq();
} return ;
}
04-18 15:05