題目描述單詞接龍是一個與咱們常常玩的成語接龍相相似的遊戲,如今咱們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的「龍」(每一個單詞都最多在「龍」中出現兩次),在兩個單詞相連時,其重合部分合爲一部分,例如beastbeastbeast 和 astonishastonishastonish ,若是接成一條龍則變爲beastonishbeastonishbeastonish ,另外相鄰的兩部分不能存在包含關係,例如 atatat 和atideatideatide 間不能相連。ios
輸入格式:ide
輸入的第一行爲一個單獨的整數
n*n (n≤20)
表示單詞數,如下n*n
行每行有一個單詞,輸入的最後一行爲一個單個字符,表示「龍」開頭的字母。你能夠假定以此字母開頭的「龍」必定存在.idea輸出格式:spa
只需輸出以此字母開頭的最長的「龍」的長度code
來源
洛谷P1019 遊戲鑑定
讀題有坑
注意max_初始化ci
短小精悍(?)的深搜代碼:字符串
#include <iostream> #include <string> using namespace std; int n,max_; string str[20]; int b[20]; int mix(string str1, string str2) {//若是沒有重疊部分就返回-1,不然返回重疊部分開始的位置 for(int k=str1.size()-1; k>=0; k--) {//貪心,爲了讓合併後的字符串儘可能長必定要從後往前判斷 bool r=1; int i_2=0; for(int i=k; i<=str1.size()-1; i++) { if(!(i_2<=str2.size()-1)) {//判斷str2邊界 r=0; break; } else if(str1[i]!=str2[i_2]) { r=0; break; } i_2++; } if(r) return k; } return -1; } void search(int cur, string s) { bool bb=1;//bb規定:0表示有至少一個解,1表示此狀況無解 for(int i=0; i<n; i++) if(b[i]<=1) {//注意每一個單詞能夠用兩次 bb=0; int t=mix(s,str[i]); if(t!=-1) { string news; for(int i=0; i<=t-1; i++) news+=s[i]; news+=str[i];//合併兩個字符串 b[i]+=1; search(cur+1, news); b[i]-=1; } } if(bb&&max_<s.size()) max_=s.size();//更新max_ } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=0; i<=n-1; i++) cin>>str[i]; char a; cin>>a; for(int i=0; i<n; i++) if(str[i][0]==a) {//枚舉每一個以字符a開頭的字符串 b[i]=1; string t=str[i]; if(max_<t.size()) { max_=t.size();//初始化max_ } search(0, t);//開搜! b[i]=0; } cout<<max_; return 0; }