99-单词拼接

内存限制:64MB
时间限制:3000ms
特判: No

通过数:7
提交数:14
难度:5

题目描述:

给你一些单词,请你判断能否把它们首尾串起来串成一串。

前一个单词的结尾应该与下一个单词的道字母相同。

aloha

dog

arachnid

gopher

tiger

rat

可以拼接成:aloha.arachnid.dog.gopher.rat.tiger

输入描述:

第一行是一个整数N(0<N<20),表示测试数据的组数
每组测试数据的第一行是一个整数M,表示该组测试数据中有M(2<M<1000)个互不相同的单词,随后的M行,每行是一个长度不超过30的单词,单词全部由小写字母组成。

输出描述:

如果存在拼接方案,请输出所有拼接方案中字典序最小的方案。(两个单词之间输出一个英文句号".")
如果不存在拼接方案,则输出
***

样例输入:

复制

2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm

样例输出:

aloha.arachnid.dog.gopher.rat.tiger
***

C/C++:

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <set>
#include <map>
#include <queue>
#include <climits>
#include <bitset>
#define eps 1e-6
using namespace std; int in[], out[], my_book[], my_route[], n; struct node
{
int h, t;
char s[];
}my_str[]; bool cmp(node a, node b)
{
return strcmp(a.s, b.s) < ;
} int euler()
{
int my_begin = -, my_end = -;
for (int i = ; i < ; ++ i)
{
if (out[i] != in[i])
{
if (out[i] - in[i] == && my_begin == -) my_begin = i;
else if (out[i] - in[i] == - && my_end == -) my_end = i;
else return -;
}
}
if (my_begin > - && my_end > -) return my_begin;
if (my_begin == - && my_end == -)
{
for (int i = ; i < ; ++ i)
if (out[i] != ) return i;
}
return -;
} bool dfs(int my_loc_int, int cnt)
{
if (cnt == n) return true;
for (int i = ; i < n; ++ i)
{
if (my_book[i] || my_str[i].h < my_loc_int) continue;
else if (my_str[i].h > my_loc_int) return false;
else
{
my_book[i] = ;
my_route[cnt] = i;
if (dfs(my_str[i].t, cnt + )) return true;
my_book[i] = ;
}
}
return false;
} int main()
{
ios::sync_with_stdio(false);
int t;
scanf("%d", &t);
while (t --)
{
/**
初始化
*/
memset (in, , sizeof(in));
memset (out, , sizeof(out));
memset (my_book, , sizeof(my_book)); /**
输入数据
*/
scanf("%d", &n);
for (int i = ; i < n; ++ i)
{
scanf("%s", my_str[i].s);
int len = strlen(my_str[i].s);
my_str[i].h = my_str[i].s[] - 'a';
my_str[i].t = my_str[i].s[len - ] - 'a';
out[my_str[i].h] ++;
in[my_str[i].t] ++;
} /**
@parm: my_begin 开始位置的首字母对应ASC - 'a'
*/
int my_begin = euler();
if (my_begin == -)
{
printf("***\n");
continue;
}
sort(my_str, my_str + n, cmp);
/**
判断是否能找出这样一条路径来
*/
if (dfs(my_begin, ))
{
for (int i = ; i < n-; ++ i)
printf("%s.", my_str[my_route[i]].s);
printf("%s\n", my_str[my_route[n - ]].s);
}
else
{
printf("***\n");
}
} return ;
}

Give Me Help

nyoj 99-单词拼接 (euler, dfs)的更多相关文章

  1. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  2. nyoj 99 单词拼接

    点击打开链接 单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...

  3. NYIST 99 单词拼接

    单词拼接时间限制:3000 ms | 内存限制:65535 KB难度:5 描述给你一些单词,请你判断能否把它们首尾串起来串成一串.前一个单词的结尾应该与下一个单词的道字母相同.如 aloha dog ...

  4. 单词拼接(dfs/回溯/递归)

    单词拼接传送门 //单词拼接 #include<stdio.h> #include<string.h> #include<algorithm> using name ...

  5. NYOJ 单词拼接

    # include<iostream> # include<string> # include<string.h> # include<queue> # ...

  6. NOIP2000单词接龙[DFS]

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

  7. 单词接龙dfs洛谷

    题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...

  8. 力扣算法题—079单词搜索【DFS】

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...

  9. P1101 单词方阵 简单dfs

    题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单 ...

随机推荐

  1. boost::VS2017下编译和配置boost库

    环境: win10  vs2017  v141 1.下载  boost_1_70_0.zip. 2.以管理员方式打开 3. bootstrap.bat 4.编译64位库 b2.exe stage -- ...

  2. Eureka错误解决方法

    # Eureka错误解决方法 ## security.basic.enabled 配置过时或不可用默认情况下:用户名:user密码:启动应用在控制台会输出,如下图: 也可以通过如下属性配置:sprin ...

  3. springMVC初学简单例子

    新建web项目,保留web.xml. 配置web.xml文件(/WEB-INF/下): <?xml version="1.0" encoding="UTF-8&qu ...

  4. 判断一字串String中是否包含某一串字符串

    String ostype = data.getString("osType").toUpperCase(); //转换为大写 if (ostype.contains(" ...

  5. 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块

    一. IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接 ...

  6. 百万年薪python之路 -- 并发编程之 多线程 一

    多线程 1.进程: 生产者消费者模型 一种编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后遇到类似的情况,套用即可 生产者与消费者模型的三要素: 生产者:产生数据的 消费者:接收数据 ...

  7. Charles抓包工具的使用(一)

    前提:charles的说明 Charles其实是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在W ...

  8. Mysql数据库(六)视图

    一.视图是由数据库中的一个表或多个表导出的虚拟表.其作用是方便用户对数据的操作. 1.视图的概念 2.视图的作用 二.创建视图 创建视图是指在已经存在的数据表上建立视图.视图可以建立在一张表中,也可以 ...

  9. Java基础(四)注释

    1.类注释 类注释必须放在import语句之后,类定义之前.eclipse中使用Shift + Alt + J快捷键添加类注释. 2.方法注释 每一个方法注释必须放在所描述的方法之前.除了通用标记之外 ...

  10. 数据结构(四十二)散列表查找(Hash Table)

    一.散列表查找的基础知识 1.散列表查找的定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到 ...