新颖方法
#include<string.h>
#include<iostream>
using namespace std;
struct a{
int chongd,v;
}G[25][25];
int cut[25],vis[25],trytry,n,maxn=-1;
char a[25][20],b;
int catchdragon(char* x,char* y,int m,int n){
int i=strlen(x),j=strlen(y),ok=0,changshi,chongdie;
int mininum=(i<j?i:j);
for(chongdie=1;chongdie<mininum;chongdie++){
ok=0;
for(changshi=1;changshi<=chongdie;changshi++){
if(x[i-1-chongdie+changshi]==y[changshi-1]) ok=1;
else { ok=0;break; }//注意该尝试不正确后就立刻退出
}
if(ok==1) break;
}
if(ok==1) G[m][n].chongd=chongdie;
return ok;
}
int dfs(int cur,int length){
length+=strlen(a[cur]);
int maxl=0,l,ok=0;
for(int i=1;i<=n;i++){//尝试每个点
if(vis[i]<2&&G[cur][i].v==1){//如果联通且访问次数小于2
vis[i]++;ok=1;
l=dfs(i,length-G[cur][i].chongd);
if(l>maxl) maxl=l;
vis[i]--;
}
}
if(ok==0) return length;//注意边界,找不到可以接下去的点了
else return maxl;
}
int main(){
freopen("1018.in","r",stdin);
freopen("1018.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++) scanf("%s\n",a[i]);//注意读取换行符!
scanf("%c",&b);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(catchdragon(a[i],a[j],i,j)) G[i][j].v=1;
//printf("%s %s=%d ",a[i],a[j],G[i][j]);
//printf("%d ",G[i][j]);
}
}
for(int i=1;i<=n;i++){
if(b==a[i][0]){
memset(vis,0,sizeof(vis));
vis[i]++;
trytry=dfs(i,0);
if(trytry>maxn) maxn=trytry;
}
}
printf("%d",maxn);
return 0;
}
题解:将可接龙的单词构成有向图后进行DFS,注意标记vis