單詞接龍 深度優先搜索 C++

題目描述

單詞接龍是一個與咱們常常玩的成語接龍相相似的遊戲,如今咱們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的「龍」(每一個單詞都最多在「龍」中出現兩次),在兩個單詞相連時,其重合部分合爲一部分,例如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;
}
相關文章
相關標籤/搜索