单词接龙

原题:传送门

解题思路:

  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. icp算法

    https://github.com/tttamaki/ICP-test https://github.com/tttamaki/SICP-test

  2. oracle 11g 创建普通用户

    CREATE USER xiaoming IDENTIFIED by xm123123 GRANT CREATE SESSION TO xiaoming; GRANT RESOURCE TO xiao ...

  3. What Are Tango Poses?Tango姿态是什么?

     What Are Tango Poses?什么是Tango姿态? As your device moves through 3D space, it calculates where it is ( ...

  4. jmeter 计数器 (可自动生成新数字、注册专用)

    1.打开jmeter,创建好线程组后,添加计数器 2.设置计数器 3.添加HTTP请求,验证所设置的计数器 4.填写对应参数 5.添加查看结果树,查看结果 6.修改一下线程属性 7.跑一下,看下结果就 ...

  5. .NET框架源码解读之SSCLI编译过程简介

    前文演示了编译SSCLI最简便的方法(在Windows下): 在“Visual Studio 2005 Command Prompt”下,进入SSCLI的根目录: 运行 env.bat 脚本准备环境: ...

  6. 使用jdbc的方式访问kylin cube的数据

    使用jdbc的方式访问kylin cube的数据 引用kylin相关的jar包 <dependency> <groupId>org.apache.kylin</group ...

  7. Tomcat启动报错Invalid character found in method name. HTTP method names must be tokens

    1.tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同. 端口一: 修改http访问端口(默认为8080端口),配置文件为 ...

  8. 对virtual虚方法的理解

    对virtual虚方法的理解 https://www.cnblogs.com/u3ddjw/p/6676485.html

  9. 基于ASP.NET生成二维码详细源码

    详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeakusing System; using ...

  10. unity 移动物体的方式

    1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...