【搜索】noi openjudge 2.5 单词接龙
2016-08-23 21:04
447 查看
题目:
总时间限制: 1000ms 内存限制: 65536kB
描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
输入输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。
输出只需输出以此字母开头的最长的“龙”的长度。
样例输入
样例输出
提示连成的“龙”为atoucheatactactouchoose
来源NOIP2000复赛 普及组 第四题
分析:
这道题可以用搜索的方法来完成。
它这里告诉我们:以指定的字母开头的单词为“头”,且这样的单词一定存在。
那么,我们就可以依次找到可以作为头的单词,从它开始进行搜索。
接下来便有个问题:如何将两个单词组合在一起?
假定我们要把b放到a后面,那么我们可以把b的第一个字母在a中最后出现的位置找出来。
此时,我们便可以判断b中是否包含a,a中是否包含b或b无法与a连接。
然后,我们便可以检查这个位置后的i个字母是否是b开头的i个字母。如果不是,便无法连接。否则,把两个单词的长度加起来,减去公共部分的长度,即为组合后的单词长度。
代码:
(就知道你要直接看代码,自己先写一些吧!)
总时间限制: 1000ms 内存限制: 65536kB
描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
输入输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。
输出只需输出以此字母开头的最长的“龙”的长度。
样例输入
5 at touch cheat choose tact a
样例输出
23
提示连成的“龙”为atoucheatactactouchoose
来源NOIP2000复赛 普及组 第四题
分析:
这道题可以用搜索的方法来完成。
它这里告诉我们:以指定的字母开头的单词为“头”,且这样的单词一定存在。
那么,我们就可以依次找到可以作为头的单词,从它开始进行搜索。
接下来便有个问题:如何将两个单词组合在一起?
假定我们要把b放到a后面,那么我们可以把b的第一个字母在a中最后出现的位置找出来。
此时,我们便可以判断b中是否包含a,a中是否包含b或b无法与a连接。
然后,我们便可以检查这个位置后的i个字母是否是b开头的i个字母。如果不是,便无法连接。否则,把两个单词的长度加起来,减去公共部分的长度,即为组合后的单词长度。
代码:
(就知道你要直接看代码,自己先写一些吧!)
#include<cstdio> #include<cstdio> #include<cstring> char w[25][30]; short v[25]; char s; int sum, ans, n, l[25]; int find(int a, int b) { int i, j; for(i = l[a] - 1; i > 0 && w[a][i] != w[b][0]; i--); if(i < 1) return l[b]; for(j = 0; i < l[a] && j < l[b] && w[a][i] == w[b][j]; i++, j++); if(i == l[a] && j != l[b]) return j; return l[b]; } void sol(int i) { for(int j = 0; j < n; j++) { if(v[j] != 2) { v[j]++; int k = find(i, j); if(k != l[j]) { sum += l[j] - k; sol(j); sum -= l[j] - k; } v[j]--; } } ans = (sum > ans ? sum : ans); } int main() { int i; scanf("%d", &n); for(i = 0; i < n ; i++) { scanf("%s", w[i]); l[i] = strlen(w[i]); } scanf("%c%c", &s, &s); for(i = 0; i < n; i++) { if(w[i][0] == s) { v[i] = 1; sum = l[i]; sol(i); v[i] = sum = 0; } } printf("%d", ans); }
相关文章推荐
- OpenJudge 2.5-8783 单词接龙
- 【搜索】—深搜遍历 noi openjudge 2.5 A Knight's Journey
- 【搜索】 noi openjudge 2.5 拯救行动
- 【搜索】— 广搜队列 noi openjudge 2.5 Dungeon Master
- NoiOpenJudge 2.5 红与黑
- NoiOpenJudge 2.5 马走日
- NOI2.5 8783:单词接龙
- NoiOpenJudge 2.5 城堡问题
- NoiOpenJudge 2.5 Lake Counting
- NOI OpenJudge 8468 单词序列
- OpenJudge noi 8468单词序列
- NoiOpenJudge 2.5 献给阿尔吉侬的花束
- OpenJudge noi 2987 小兔子捡金币(模拟)
- openjudge 计算概论 字符串 5:单词排序
- openjudge noi 2987 小兔子捡金币(模拟)
- noi.openjudge.cn 题目用到的头文件
- OPENJUDGE NOI 7624 山区建小学
- OpenJudge noi 1486 A Funny Game
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35
- noi.openjudge 1909 直方图