单词接龙

原题:传送门

解题思路:

  1. 此题是典型的深搜题目,首先确定递归变量,表示字母的数量,每当满足一定条件,就往下一层递归,否则回溯
  2. 判断由哪个单词开始(因为可能字母首位可能相同),再确定之后所连单词,还需要标记数组防止重复选择
  3. 小心题目要求,每个单词最多可以出现两次,开始的时候字母弄成两个即可,还有字母之间不能包含,循环时注意下长度

核心代码:

 /*
string类稍微方便一些,记得最后比较长度
*/
#include<iostream>
#include<algorithm>
#include<string>
using namespace std; string str[];
int mark[], label[], len[], sum, n, ans;
char c; //mark标记是否用过该字母,label记住该字母在str数组中下标,len记住该字母长度
void dfs(int k)
{
if (k == ){//确定首位
for (int i = ; i <= * n; i += ){
if (mark[i] == && str[i][] == c){
sum += str[i].length(); mark[i] = ; label[k] = i; len[k] = str[i].length();
dfs(k + );
sum -= len[k]; mark[i] = ;//回到上一步,清除标志
}
}
}
else{
for (int i = ; i <= * n; i++){//这里是i++表示每个字母都会遍历两遍
if (mark[i] == ){
bool judge = false;
int pre = label[k - ], j;
int len1 = str[pre].length(), len2 = str[i].length();
int Len = min(len1, len2);//字符串不能包含,题意
for (j = ; j < Len; j++)
{ //substr函数返回子字符串,(开始位置,长度)
if (str[pre].substr(len1 - j, j) == str[i].substr(, j))
{
judge = true;
break;
}
}
if (judge)
{
mark[i] = ; label[k] = i; len[k] = len2 - j; sum += len[k];
dfs(k + );
mark[i] = ; sum -= len[k];//回到上一步,清除标记
}
}
}
}
ans = max(ans, sum);//最后比较最长是多少
}
int main()
{
cin >> n;
for (int i = ; i <= * n; i += ){
cin >> str[i];
str[i + ] = str[i];//每个字母最多使用两次
}
cin >> c;
dfs();
cout << ans << endl;
return ;
}

CODEVS-1018单词接龙的更多相关文章

  1. Codevs 1018 单词接龙

    1018 单词接龙 2000年NOIP全国联赛普及组NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描 ...

  2. 【wikioi】1018 单词接龙

    题目链接 算法:DFS+考你阅题 题目描述: 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中 ...

  3. codevs 1018 [noip 2000 提高] 单词接龙

    题目链接:http://codevs.cn/problem/1018/ 题目描述 Description 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  4. 单词接龙(codevs 1018)

    2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 单词接龙是一个与我们经 ...

  5. NOIP2000单词接龙[DFS]

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  6. Noip2000 T3 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  7. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  8. NOIP2000 单词接龙

    题三.  单词接龙                (27分)    问题描述    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...

  9. 1172: 单词接龙(XCOJ 暴力DFS)

    1172: 单词接龙 时间限制: 1 Sec  内存限制: 128 MB提交: 12  解决: 5 标签提交统计讨论版 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词 ...

  10. 单词接龙(dragon)

    单词接龙(dragon) 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ...

随机推荐

  1. vs与qt

    http://blog.csdn.net/woniuye/article/details/54928477 1. #include "qmessagebox.h" QMessage ...

  2. iPhone X的UI设计技巧

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 果粉们翘首以待的iPhone X终于开始预售了!同样满怀期待的还有设计师和开发人员,他们将在iPho ...

  3. 关于C语言中的Complex(复数类型)和imaginary(虚数类型)

    关于C语言中的Complex(复数类型)和imaginary(虚数类型) 其实这里的复数complex就是数学里的复数,包含实部和虚部两个部分,比如:x=2.1+6i,下面进行详细介绍. C99 新增 ...

  4. 微信小程序进行地图导航使用地图功能

    之前我写过的文章当中,提过小程序的打包大小.所以特地去下载一个区域的地图的这种方法,是不存在的. 我用的导航主要使用的是应用外的导航,这篇文章可能对于非常熟悉小程序的小伙伴来说就是小case,所以只适 ...

  5. PostgreSQL CPU满(100%)性能分析及优化

    业务场景:大批量更新时,数据库长时间CPU占用超过90,影响其他正常业务流程,参考阿里云上的一篇文章:https://help.aliyun.com/knowledge_detail/43562.ht ...

  6. VR眼镜和AR眼镜的区别

    VR眼镜是纯虚拟的世界建模,不结合现实世界.(VR一体机和手机VR眼镜是不同的,不只是是不是以手机为载体播放器的问题,而是它们结构上也有很大的区别:另外还有一点就是电脑端VR,这个主要是游戏:http ...

  7. 基于微软XAML技术的前端开发方法

    使用XAML技术的平台目前包括WPF,Silverlight,Windows8等平台,未来的Windows10统一Windows App也使用XAML技术. 前端开发指通过可视化集成开发环境进行用户界 ...

  8. java向数据库插入N条数据

    为了测试mysql的索引,要向数据库先插入上万条数据,然后再测试.手动插入太麻烦,写了一段代码. 先上代码: package action; import java.sql.Connection; i ...

  9. MSP430 G2553 基本时钟模块+ (Basic Clock Module+)

    一.时钟源 MSP430的Basic Clock Module+支持的时钟源有: DCOCLK:内部数字控制振荡器,Internal digitally contrlled oscillator.所有 ...

  10. Visual Studio Code 基本操作 - Windows 版

    1.Install the .NET SDK 2.Create app: dotnet new console -o myApp cd myApp 3.Run your app:dotnet run