首页 > 技术文章 > NOIP2000提高组 单词接龙

Neworld1111 2018-02-25 22:05 原文

题目-洛谷-单词接龙

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;
    }
就是这样啦!

推荐阅读