日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(回溯 UVa129)困难的串

發布時間:2025/3/12 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (回溯 UVa129)困难的串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 題目:
      • 分析與解答:

題目:

如果一個字符串包含兩個相鄰的重復子串,則稱它是“容易的串”,其他串成為“困難的串”。例如:BB,ABCDACABCAB,ABCDABCD都是容易的,而D、DC、ABDAB、CBABCBA
都是困難的。
輸入正整數n和L,輸出由前L個字符組成的、字典序第n個小的困難的串。例如,當L=3時,前7個困難的串分別為:A、AB、ABA、ABAC、ABACA、ABACAB、ABACABA。
輸入保證答案不超過80個字符
輸入:
7 3
30 3
輸出:
ABACA BA
ABACA BCACB ABCAB ACABC ACBAC ABA

分析與解答:

在回溯算法中,應注意避免不必要的判斷,八皇后問題中,只需判斷新皇后和之前的皇后是否沖突,而不必判斷以前的皇后是否相互沖突。
這一題只需判斷當前串的偶數項后綴是否對稱

BB,長度為1*2的后綴對稱
ABCDACABCAB,長度為3*2的后綴對稱
ABCDABCD長度為4*2的后綴對稱

像這些對稱的串,必定不為困難的串

#include<stdio.h> #include<string.h> #define MAX 90 int S[MAX]; //保存第i個位置應該放哪個字符 int n,L; int dfs(int cur) //返回0表示已經得到解 { int i,j,k;if(cur == n){for(i=0;i<cur;i++){printf("%c",'A'+S[i]);}printf("\n");return 0;}for(i=0;i<L;i++){int ok=1; //判斷方案是否合法S[cur]=i; //將當前位置設定為i“0==A,1==B,2==C”for(j=1;2*j<=cur+1;j++) //循環判斷長度長度為j*2的后綴{int equal=1; //判斷后綴中是否有前一半是否等于后一半for(k=0;k<j;k++){if(S[cur-k]!=S[cur-k-j]) //只要確定了后綴j*2中有一個不相等,則可以確定前一半與后一半不相等{equal=0;break;}}if(equal)//前一半等于后一半,方案不合法 {ok=0;break;}}if(ok){if(!dfs(cur+1)) //到這里,說明0到cur位置的困難串已經確立好了,確立下一個位置就好//如果已經找出字典序第n小的串,那么dfs(cur+1)返回0,此時直接退出 return 0;}}return 1; } int main() {while(scanf("%d%d",&n,&L)!=EOF){memset(S,0,sizeof(S));dfs(0);}return 0; }

總結

以上是生活随笔為你收集整理的(回溯 UVa129)困难的串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。