算法竞赛入门经典(第二版) | 程序3-10 生成元 (UVa1584,Circular Sequence)
生活随笔
收集整理的這篇文章主要介紹了
算法竞赛入门经典(第二版) | 程序3-10 生成元 (UVa1584,Circular Sequence)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目概述:
長度為n的環狀串有n種表示法, 字典序最小的稱為最小表示。輸入一個長度為n(n<100)的環狀字符串的一種表示方法,輸出最小表示 。
如:CTCC 為環狀字符串的一種表示方法,它的所有表示方法分別為:CTCC、TCCC、CCCT、CCTC。其中最小表示為CCCT。
儲備知識:
字典序:
字典序:按字典順序從兩個字符串的第一位開始比較,字典順序靠前的串較小。若兩串前n個字母都相同,但串A長于串B,則串B小。
如:ABCD小于BCDA
思路:
將序列放入無頭指針循環鏈表(一定是無頭指針的鏈表,否則判每次遍歷都需跳過頭指針,非常麻煩)。
利用循環鏈表的循環特性求出每種情況, 分別比較。 代碼其實并不長,只是寫鏈表占了很多行。
收獲:
掌握了無頭指針循環鏈表的定義方法,學到了字典序的概念。
代碼:
#include <iostream> #include <cstdio> #include <list> #include <cstdlib> #include <cstring>using namespace std ;typedef struct LNode *lbook ; struct LNode{char x ;struct LNode *list ; }; //創建 lbook Creat(char a[] , int len1) {lbook P , P1 , P2 ;P = (lbook)malloc(sizeof(LNode)) ; //無頭指針 P->x = a[0] ; //無頭指針的鏈表定義方式 P1 = P;int j = 1 ;while(j != len1) {char s = a[j++] ;lbook P3 ;P3 = (lbook)malloc(sizeof(LNode)) ;P3->x = s ;P3->list = P1->list ;P1->list = P3 ;P1 = P3 ;}P1->list = P ; //循環鏈表 return P ; }//查找 lbook Find(lbook P , int len , int i) { int k = 0 ; while(k++ != len) {if(k == i) return P ;P = P->list ;} } int main() {//悔棋很麻煩。 lbook L ;char a[105] ;cin >> a ; //輸入 int len = strlen(a) ; //輸入字符串a的長度L = Creat(a , len) ; if(len == 1) { //特殊情況:長度為1則直接輸出。 Show(L,len) ;return 0 ;}//每條鏈比較字典序,n條鏈需比較n-1次。int k = 0 ; int s = 2 ;char c[105] ; //存放結果strcpy(c,a) ; //c先行存放a數組的值。 while(k++ != (len-1)) {lbook LL = Find(L, len, s) ;s++ ;//定義d數組,分別存放環狀序列所有結果 char d[105] ; int r = 0 ;while(r != len) {d[r] = LL->x ;r++ ;LL = LL->list ;}//若c>d,則將d賦給c,重復操作。 if((strcmp(c,d)) == 1) strcpy(c,d) ;} cout << c ; return 0 ;} 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的算法竞赛入门经典(第二版) | 程序3-10 生成元 (UVa1584,Circular Sequence)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ctype.h(cctype) 头文件函
- 下一篇: 15行代码AC——习题3-1 得分 (U