当前位置:   article > 正文

单词接龙(c++)_单词接龙c++

单词接龙c++
回溯,反向查找rfind()
描述

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

输入

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

输出

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

输入样例 1 

5
  at
  touch
  cheat
  choose
  tact
  a

输出样例 1

23

 

 

 

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string.h>//memset
  4. #include <string>
  5. using namespace std;
  6. int n;//单词总数
  7. string a[20];//记录单词
  8. char s;//开头字母
  9. int coun;//记录接龙长度
  10. int maxc;//最大长度
  11. int visit[20];//记录单词被接龙次数
  12. void dep(int x)//为龙尾单词的索引
  13. {
  14. if(coun>maxc)maxc=coun;
  15. /*
  16. rfind()反向查找***************************************************************
  17. 为了接根长的龙(eg:tact)
  18. */
  19. for(int i=0;i<n;i++)
  20. {
  21. //找到还可以再接龙(接龙小于2次且龙含有该单词的首字母(从龙尾单词的右边向左找)
  22. if(visit[i]<2&&a[x].rfind(a[i][0]))
  23. {
  24. int f=a[x].rfind(a[i][0]);
  25. int t=0;
  26. while(f!=0)//左不包含
  27. {
  28. if(f==a[x].length()||t==a[i].length())break;//遍历结束
  29. if(a[x][f]!=a[i][t])break;//字母不相同
  30. f++;
  31. t++;
  32. }
  33. 接龙成功:首尾字符串匹配且不右包含且不左包含
  34. if(f==a[x].length()&&t<a[i].length()&&a[x].rfind(a[i][0]))
  35. {
  36. visit[i]++;
  37. //a[x].rfind(a[i][0])为在a[x]中从右方向第一次出现字符a[i][0]的位置,
  38. //下角标从0开始
  39. int temp=a[i].length()-a[x].length()+a[x].rfind(a[i][0]);//增长部分
  40. coun+=temp;
  41. dep(i);
  42. //回溯
  43. coun-=temp;
  44. visit[i]--;
  45. }
  46. }
  47. }
  48. }
  49. int main()
  50. {
  51. //输入
  52. cin>>n;
  53. for(int i=0;i<n;i++)
  54. {
  55. cin>>a[i];
  56. }
  57. cin>>s;
  58. maxc=0;
  59. //遍历每一个可以开头的单词进行接龙
  60. for(int i=0;i<n;i++)
  61. {
  62. if(a[i][0]==s)
  63. {
  64. memset(visit,0,sizeof(visit));//初始化
  65. visit[i]=1;//接入开头单词
  66. /*
  67. 获取字符串长度或者字符串数组长度的函数有
  68. sizeof(),length(),strlen(),size()
  69. 其中strlen(str)和str.length()和str.size()都可以用来求字符串的长度
  70. str.length()和str.size()是用于求string类对象的成员函数
  71. strlen(str) 是用于求字符串数组的长度,其参数是char*
  72. strlen(char*)
  73. 函数求是字符串的实际长度,它可以用来获取动态实际字符数组的长度,
  74. 是从开始到遇到第一个“\0”,如果只是定义没有赋予初始值,
  75. 这个结果是不确定的,它会从数组的首地址开始一直找下去,
  76. 直到遇到“\0”停止查找。
  77. sizeof()
  78. 求所占总空间的字节数,静态的,跟初始状态字符数组的大小有关系,
  79. 大小等于初始时字符数组的大小或者等于初始时字符数组的大小+1
  80. 在C++中,如果定义的是字符串数组的话,那么如果想获取数组的长度,
  81. 只能用sizeof(数组名),而不能用strlen(str)
  82. */
  83. coun=a[i].length();//初始为开头单词长度
  84. dep(i);//接龙
  85. }
  86. }
  87. cout<<maxc;
  88. return 0;
  89. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/144353?site
推荐阅读
相关标签
  

闽ICP备14008679号