博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1019 单词接龙【经典DFS,温习搜索】
阅读量:6085 次
发布时间:2019-06-20

本文共 2334 字,大约阅读时间需要 7 分钟。

P1019 单词接龙

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
5attouchcheatchoosetacta
输出样例#1:
23           (连成的“龙”为atoucheatactactouchoose)

说明

NOIp2000提高组第三题

题目链接:

分析:经典DFS,

思路:暴力枚举每一个以给定字母开头的字符串,然后开始搜索,在搜索判断是否相重的时候可以找出当前字符串(龙)的最后一个字符

然后再在将要比较的字符串里暴力找,如果能找到,再从当前位置往前找。如果直到将要比较的字符串全部比较完且全部相同,就加到龙里面

易错点:

1.可以无视题目中的at与atite的相互包含问题

2.不要忽视自身和自身相连的情况

3.注意龙和其长度和使用情况的初始值!!

4.注意+1-1的边界问题!!

详细注释在代码中已经给出,请参考代码

下面给出AC代码:

1 #include
2 using namespace std; 3 int n,used[20]={
0},maxn=0; //n为单词数 used数组检测该单词是否已经被用多于两次(用++实现) maxn表示最大长度 4 string s[20],sum,x; //s字符串数组为读入单词 sum为各个情况最后所形成的龙 x为开头字母 5 void dfs(string last) 6 { 7 if(last.size()==1) 8 sum=last; //将开头字母看成上一个单词 用x初始化sum 9 bool ans=0; //表示接下来是否有符合要求的单词10 for(int i=0;i
=0;j--)16 { //从上一个单词的最后往前搜索17 if(last[j]==s[i][0])18 { //当该字母与当前单词首字母相同时19 m=1;20 ans=1; //有单词可接21 while(last[j+m]==s[i][m])22 m++; //记录相同字母数量23 }24 if(ans&&j+m==last.size())25 break; //若该字母加上相同字母数量等于原单词长度 该单词可接26 if(ans&&j+m!=last.size())27 ans=0; //若不等 则ans恢复为0(即可能只是在上一个单词的中间出现与下一个单词相同的部分)28 }29 if(ans)30 {31 int len=sum.size();32 sum+=s[i].substr(m,s[i].size()-m); //在sum后面添加s[i]字符串第m(-1+1)个位置的s[i].size()-m个字符(下一个单词相同字母后的字母)33 used[i]++; //使用次数增加34 dfs(s[i]); //下一个单词搜索35 ans=0; //恢复36 used[i]--;37 sum.erase(len,s[i].size()-m); //删去sum中len位置起的s[i].size()-m个字符(恢复原单词)38 }39 }40 }41 if(!ans&&sum.size()>maxn)42 maxn=sum.size(); //记录最大长度43 return;44 }45 int main()46 {47 cin>>n;48 for(int i=0;i
>s[i];50 cin>>x;51 dfs(x);52 cout<
<

 

 

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/7118210.html

你可能感兴趣的文章
好程序员web前端分享JS检查浏览器类型和版本
查看>>
Oracle DG 逻辑Standby数据同步性能优化
查看>>
exchange 2010 队列删除
查看>>
「翻译」逐步替换Sass
查看>>
H5实现全屏与F11全屏
查看>>
处理excel表的列
查看>>
C#数据采集类
查看>>
quicksort
查看>>
【BZOJ2019】nim
查看>>
LINUX内核调试过程
查看>>
【HDOJ】3553 Just a String
查看>>
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>
ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
查看>>
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>
07-k8s-dns
查看>>