Acwing 1117.单词接龙【DFS】

1.题目
题目链接:点击这里

2.解决思路
可以先将所有可能的“衔接”(即接龙)情况枚举出来;对于每一对字符串(A,B)单词A的后缀与单词B的前缀相同,并找到最长的相同情况,记为g[a][b]=length。注意不能将整个A用来接龙。然后对于某个字母开头的字符串使用DFS,找到它能够接龙的最大值。

3.代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int MAXN=21;

string words[MAXN];
int g[MAXN][MAXN];
int n,used[MAXN],ans;
char start;

void dfs(string state,int t)
{
    
    
    ans=max(ans,(int)state.size());
    
    used[t]++;
    
    for(int i=1;i<=n;i++){
    
    
        if(g[t][i]&&used[i]<2)
            dfs(state+words[i].substr(g[t][i]),i);//接龙
    }
    
    used[t]--;
}

int main(void)
{
    
    
    cin>>n;
    
    for(int i=1;i<=n;i++) cin>>words[i];
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
    
    
            string a=words[i],b=words[j];
            for(int k=1;k<min(a.size(),b.size());k++){
    
    
                if(a.substr(a.size()-k,k)==b.substr(0,k)){
    
    
                    g[i][j]=k;
                    break;
                }
            }
        }
        
    cin>>start;
    
    for(int i=1;i<=n;i++){
    
    
        if(words[i][0]==start)
            dfs(words[i],i);
    }
    
    cout<<ans<<endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43579980/article/details/120194481