zoukankan      html  css  js  c++  java
  • 洛谷 P1019 单词接龙

    题目描述

    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

    输入输出格式

    输入格式:

     

    输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

     

    输出格式:

     

    只需输出以此字母开头的最长的“龙”的长度

     

    输入输出样例

    输入样例#1: 复制
    5
    at
    touch
    cheat
    choose
    tact
    a
    
    输出样例#1: 复制
    23           (连成的“龙”为atoucheatactactouchoose)   

    说明

    NOIp2000提高组第三题

    思路:深搜。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int vis[21];
    int n,ans,now=1;
    char word[21][10000];
    void dfs(int k){
        ans=max(ans,now);
        for(int i=1;i<=n;i++)
            if(vis[i]<2)
                for(int j=0;j<strlen(word[k]);j++){
                    if(word[i][0]==word[k][j]){
                        int l1=j,l2=0;
                        while(word[i][l2]==word[k][l1]&&l1<strlen(word[k]))    l1++,l2++;
                        if(l1>=strlen(word[k])){
                            now+=strlen(word[i])-l2;
                            vis[i]++;dfs(i);
                            now-=strlen(word[i])-l2;
                            vis[i]--;
                        }
                    }
                }
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++)    cin>>word[i];
        cin>>word[0];
        dfs(0);
        cout<<ans;
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    markdown with vim
    递归
    类 sizeof
    cppcheck工具
    c++ explicit的含义和用法
    pca主成分分析
    string的使用
    linux的shell进化简史
    adb shell 无法启动 (insufficient permissions for device)
    c++ 四种转换的意思
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8321179.html
Copyright © 2011-2022 走看看