码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷1019 单词接龙 字符串dfs

时间:2017-10-08 22:42:44      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:mic   for   nis   font   游戏   关系   cst   pac   c++   

问题描述

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

题解

第一次知道c++字符串可以直接拼接。。感觉就是暴力模拟啊,写一个dfs找最大长度,每次判断能不能进行拼接,然后进行相接找最大长度。

 

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
string s;
string word[110];
int use[110];
int n,ans;
bool check(string a,string b,int m){
    int len=a.length();
    for(int k=0;k<m;k++){
        if(a[len-m+k]!=b[k])return 0;
    }
    return 1;
}
void add(string &a,string b,int m){
    int len=b.length();
    for(int i=m;i<len;i++){
        a+=b[i];
    }
}
void dfs(string now){
    int len=now.length();
    ans=max(len,ans);
    for(int i=1;i<=n;i++){
        if(use[i]>=2)continue;
        int k=word[i].length();
        for(int j=1;j<=k;j++){
            if(check(now,word[i],j)){
                string tmp=now;
                add(tmp,word[i],j);
                int q=tmp.length();
                if(q<=len)continue;
                use[i]++;
                dfs(tmp);
                use[i]--;
            }
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>word[i];
    }
    cin>>s;
    dfs(s);
    printf("%d",ans);
    return 0;
}

 

洛谷1019 单词接龙 字符串dfs

标签:mic   for   nis   font   游戏   关系   cst   pac   c++   

原文地址:http://www.cnblogs.com/Elfish/p/7638619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!