标签: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; }
标签:mic for nis font 游戏 关系 cst pac c++
原文地址:http://www.cnblogs.com/Elfish/p/7638619.html