P1019 单词接龙

#include<iostream>
using namespace std;

const int N = 20;

string g[N];
int n;
int maxv;
int st[N];

void dfs(const string &s, int len, int u){
    for(int i = 0; i < n; i ++){
        if(st[i]){
            st[i] --;
            int cnt = 0;
            
            for(int j = 0; j < g[i].size(); j ++)
                if(g[i][j] == s.back()){
                    cnt = j + 1;
                    break;
                }
            
            for(int j = s.size() - cnt, k = 0; j < s.size(); j ++, k ++)
                if(s[j] != g[i][k]){
                    cnt = 0;
                    break;
                }
                
            if(cnt && (cnt < s.size() && cnt < g[i].size() || u == 0))
                dfs(s + g[i].substr(cnt), s.size() + g[i].size() - cnt, u + 1);
            
            st[i] ++;
        }
    }
    
    maxv = max(maxv, len);
}

int main(){
    cin >> n;
    
    for(int i = 0; i < n; i ++){
        cin >> g[i];
        st[i] = 2;
    }
    
    string a;
    
    cin >> a;
    
    dfs(a, 0, 0);
    
    cout << maxv << endl;
}
原文地址:https://www.cnblogs.com/tomori/p/13815857.html