NOIP2000提高组 单词接龙
emmm题目叫我们找出最长的组合。那好吧就写一个深度优先搜索去try1try啊。啊很多人用字符串?那么老实干啥!题目只要求长度!!
#include <cstdio>
#include <cstring>
using namespace std;
int vis[25]={0},F[25][25]={0};
char head_ch,str[25][1000];
int N,maxlen=1;
inline int is(int u,int v){//这个函数用来判断u和v是否可以相连,如果相连那么重合的长度是多少
char head=str[v][0];
int len1=strlen(str[u]);
int len2=strlen(str[v]);
int start=len1-1;
for(int i=len1-1;i>=0;i--){
start=i;
if(str[u][i]==head)break;
}
if(start==0)return -1;
if(len1-start>=len2)return -1;
int j=0;
for(int i=start;i<len1;i++){
if(str[u][i]!=str[v][j])return -1;
j++;
}
return len1-start;
}
inline void dfs(int step,int top,int last){
if(top>maxlen)maxlen=top;
if(step==1){//开头的词
for(int i=0;i<N;i++)
if(str[i][0]==head_ch){
vis[i]=1;
dfs(2,strlen(str[i]),i);//把长度丢到下一层,最后的参数i记录是这一层使用的单词
vis[i]=0;//回溯
}
}
else{
for(int i=0;i<N;i++)
if(vis[i]<2&&F[last][i]!=-1){//只要没用过2次和与上一个单词可以连接
vis[i]++;
dfs(step+1,top+strlen(str[i])-F[last][i],i);
vis[i]--;
}
}
}
int main(){
scanf("%d\n",&N);
for(int i=0;i<N;i++)scanf("%s\n",str[i]);
scanf("%c",&head_ch);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
F[i][j]=is(i,j);
dfs(1,0,0);
printf("%d",maxlen);
return 0;
}
就是这样啦!