1. 程式人生 > >P1019 單詞接龍

P1019 單詞接龍

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>
 5
using 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 單詞接龍