UVA 129 困难的串Krypton Factor (回溯法)

骑猪看日落 2024-02-17 19:03 110阅读 0赞
  1. #include<cstdio>
  2. const int maxn=80+2;
  3. int S[maxn];
  4. int n,L,count;
  5. void print(int cur){
  6. int flag=1;
  7. for(int i=0;i<cur;i++){
  8. if(i%4==0 && i>0)
  9. {
  10. if(i%64==0 && i>0)printf("\n");
  11. else printf(" ");
  12. }
  13. printf("%c",S[i]+'A');
  14. }
  15. printf("\n%d\n",cur);
  16. }
  17. int dfs(int cur){
  18. if(count++==n){
  19. print(cur); //打印目标字符串
  20. return 0; //返回值为0,则表示找到目标串
  21. }
  22. for(int i=0;i<L;i++){ //尝试前L个字母
  23. S[cur]=i;
  24. int ok=1;
  25. for(int len=1;len<=(cur+1)/2;len++){
  26. int equal=1;
  27. for(int j=0;j<len;j++){
  28. if(S[cur-j]!=S[cur-j-len]){ equal=0;break;} //检查前一半是否等于后一半
  29. }
  30. if(equal){ok=0; break;}
  31. }
  32. if(ok){if(!dfs(cur+1))return 0;} //递归搜索,如果已经找到解,则直接退出
  33. }
  34. return 1;
  35. }
  36. int main(){
  37. while(scanf("%d%d",&n,&L)==2){
  38. if(n==0 && L==0)break;
  39. count=0; //表示第n个困难的串
  40. dfs(0);
  41. }
  42. return 0;
  43. }

发表评论

表情:
评论列表 (有 0 条评论,110人围观)

还没有评论,来说两句吧...

相关阅读

    相关 回溯

    一、回溯法的基本思想   在问题的解空间树中,按深度优先策略,从根节点出发搜素解空间树。算法搜素至解空间树的任一结点时,先判断该结点是否包含问题的解,如果肯定不包含,则跳