P1019 單詞接龍
阿新 • • 發佈:2017-05-15
ems == class ans 似的 格式 cin cnblogs num
輸出格式:
題目描述
單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關系,例如at 和 atide 間不能相連。
輸入輸出格式
輸入格式:輸入的第一行為一個單獨的整數n (n<=20)表示單詞數,以下n 行每行有一個單詞,輸入的最後一行為一個單個字符,表示“龍”開頭的字母。你可以假定以此字母開頭的“龍”一定存在.
只需輸出以此字母開頭的最長的“龍”的長度
輸入輸出樣例
輸入樣例#1:5 at touch cheat choose tact a輸出樣例#1:
23 (連成的“龍”為atoucheatactactouchoose)
說明
NOIp2000提高組第三題
思路:暴力枚舉每一個以給定字母開頭的字符串,然後開始搜索,在搜索判斷是否相重的時候可以找出當前字符串(龍)的最後一個字符
然後再在將要比較的字符串裏暴力找,如果能找到,再從當前位置往前找。如果直到將要比較的字符串全部比較完且全部相同,就加到龍裏面
易錯點:
1.可以無視題目中的at與atite的相互包含問題
2.不要忽視自身和自身相連的情況
3.註意龍和其長度和使用情況的初始值!!
4.註意+1-1的邊界問題!!
5.如果你還沒有做這個題,那麽請先手推樣例
跟大家說一個這個題調試中的小技巧:
如果你每次搜索都把龍輸出一下會讓你的調試更簡單
我的代碼形式比較簡單,但是可能有些繞,用樣例跑一邊你肯定能明白
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5using namespace std; 6 int n; 7 string a[50]; 8 int use[50];// 每個數的使用情況 9 char bg; 10 int ans; 11 int now; 12 string kk;// 已經找到的龍 13 string kong; 14 void dfs(int p) 15 { 16 //cout<<kk<<" "<<now<<endl; 17 ans=max(ans,now); 18 int lp=a[p].length(); 19 char last=a[p][lp-1]; 20 for(int i=1;i<=n;i++)//遍歷所有的字符串 21 { 22 if(use[i]<2) 23 { 24 int li=a[i].length();// 將要查找的字符串的長度 25 for(int j=0;j<li;j++) 26 { 27 if(a[i][j]==last)//i個字符串的第j位 28 { 29 int flag=0;// 判斷是否相等 30 int num=0; 31 for(int k=j;k>=0;k--) 32 { 33 char d,q; 34 d=a[p][lp-(num)-1]; 35 q=a[i][j-(num)]; 36 num++; 37 if(d==q)continue; 38 else {flag=1;break;} 39 } 40 if(flag==0) 41 { 42 use[i]++; 43 now=kk.length()+li-num; 44 kk.erase(kk.end()-num,kk.end()); 45 kk=kk+a[i]; 46 dfs(i); 47 now=kk.length()-li+num; 48 kk.erase(kk.end()-li+num,kk.end()); 49 use[i]--; 50 } 51 } 52 } 53 } 54 } 55 } 56 int main() 57 { 58 scanf("%d",&n); 59 for(int i=1;i<=n;i++) 60 cin>>a[i]; 61 cin>>bg; 62 for(int i=1;i<=n;i++) 63 { 64 if(a[i][0]==bg) 65 { 66 kk=kong; 67 now=0; 68 memset(use,0,sizeof(use)); 69 now=now+a[i].length(); 70 use[i]++; 71 kk=kk+a[i]; 72 dfs(i); 73 } 74 } 75 printf("%d",ans); 76 return 0; 77 }
P1019 單詞接龍