这道单词拼写真的是很好的搜索题目
还是用DFS进行搜索,用vis[i]表示是否用过,然后进行查找
首先从给定的头开始进行dfs然后进行遍历每个单词
1看这个单词是否用过
2看这个单词是否可以连接上
然后需要暴力一遍长度判断是否可以连接
可以的话就进行连接,然后继续深搜下去
否则话就回溯回来
这里用string类进行加和操作很方便
写判断函数就用我现在连接的这个函数最后k位置去比较如果可以就连接否则就不连接

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
string word[25];
string beging;
int ans;
int vis[1000];
int n;
int add(string &a,string b,int k){
    int lenb=b.length();
    for (int i=k;i<lenb;i++){
        a+=b[i];
    }
}
int check(string a,string b,int k)
{
  int lena=a.length();
    for (int i=0; i<k; i++)
    {
        if (a[i+lena-k]!=b[i])
        {
            return 0;
        }
    }
    return 1;
}
void dfs(string a)
{
    int len=a.length();
    ans=max(len,ans);
    for (int i=1; i<=n; i++)
    {
        if (vis[i]>=2)
        {
            continue;
        }
        else
        {
            int len2=word[i].length();
            for (int j=1; j<=len2; j++)
            {
                if (check(a,word[i],j))
                {
                    string temp=a;
                    add(temp,word[i],j);
                    if (temp==a)
                    continue;
                    vis[i]++;
                    dfs(temp);
                    vis[i]--;
                }
            }
        }
    }
}
int main()
{
    ans=0;
    scanf("%d",&n);
    memset(vis,0,sizeof(vis));
    for (int i=1; i<=n; i++)
    {
        cin>>word[i];
    }
    cin>>beging;
    dfs(beging);
    cout<<ans<<endl;
    return 0;
}