题目链接: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 = 0; for(int i = 0;i<cur;i++){ kase++; printf("%c",ans[i]); if(kase % 4 == 0 && kase != 64 && kase != cur) printf(" "); if(kase == 64 && cur != 64)printf(" "); } printf(" %d ",cur); return 0; } else{ for(int i = 0;i<L;i++){ int ok = 1; ans[cur] = 'A' + i; for(int j = 1;j*2 <= cur+1;j++){ int rignt = 1; for(int k = 0;k<j;k++){ if(ans[cur - k] != ans[cur-k-j]){ rignt = 0; break; } } if(rignt == 1){ ok = 0; break; } } if(ok){ if(!findnThSeq(cur+1)) return 0; } } } return 1; } int main(void){ while(scanf("%d%d",&n,&L) == 2 && n && L){ sumtimes = 0; findnThSeq(0); } return 0; }