AYOJ 单词接龙(搜索)
2014-03-18 16:12
197 查看
题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。输入格式
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.输出
只需输出以此字母开头的最长的“龙”的长度样例输入
5at
touch
cheat
choose
tact
a
样例输出
23思路:找到以"龙"开头的单词,从其后往前,找到以该单词中字母开头的另一个单词,接着搜索。
#include<iostream> #include<cstring> #include<string> using namespace std; string word[22]; int vis[30]; int N; int ans; bool flag = false; void dfs(string str, int o) { int i, j, k, s, len1, len2, pos; if(vis[o] > 2)return ; if((len1 = str.size()) > ans)ans = str.size(); for(i = 0; i < N; i++){ if(vis[i] < 2){//选出可用的单词 flag = false; for(pos = len1-1; pos >= 0; pos--){ if(str[pos] == word[i][0]){//pos位置与单词第一个字母相同 len2 = word[i].size();// for(k = pos,s = 0; k < len1 && len1-pos<len2; k++,s++){ if(str[k] != word[i][s])break; } if(len1-pos == s){flag = true;break;} } } if(flag == true){ string t = str; t.append(word[i], s, len2-s);//向t添加多出的部分s位置起,len2-s个字符 if(t.size() > ans)ans = t.size(); vis[i]++; dfs(t, i); vis[i]--; } } } } int main() { int i, j; char top; cin>> N; for(i = 0; i < N; i++){ cin>> word[i]; } cin>> top; for(i = 0; i < N; i++){ if( top == word[i][0] ){ vis[i]++; //每个单词最多出现两次 dfs(word[i], i); //第i个单词能接上龙头 memset(vis, 0, sizeof(vis)); } } cout<<ans<<endl; return 0; }
View Code
相关文章推荐
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
- 蓝桥杯 算法训练 单词接龙 _DFS_搜索 字符串比较
- 洛谷Oj-单词接龙-深度优先搜索
- C++搜索与回溯算法之单词接龙
- 深度优先搜索 之 CODE[VS] 1018 单词接龙 2000年NOIP全国联赛普及组NOIP全国联赛提高组
- 【搜索】单词接龙 luogu-1019
- 【搜索】noi openjudge 2.5 单词接龙
- 1018 单词接龙 (搜索 字符串处理)
- 蓝桥杯 算法训练 单词接龙 By Assassin [搜索水题]
- [NOIP提高组2000]单词接龙
- POJ 2.5 8783 && luogu p1019 单词接龙
- 百度2017暑期实习生 [编程题] 单词接龙
- 单词接龙codevs1018(noip2000)
- grep 命令系列:使用 grep 命令来搜索多个单词
- 【wikioi】1018 单词接龙
- NOIP 2000 单词接龙 解题报告
- 单词接龙
- CODE[VS] 1018 单词接龙
- NOI2.5 8783:单词接龙
- [NOIP2000] 提高组 洛谷P1019 单词接龙