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. PMBOK(第六版) PMP笔记——《十三》第十三章(项目干系人管理)

    PMBOK(第六版) PMP笔记——<十三>第十三章(项目干系人管理) 第十三章 项目干系人管理: 了解干系人的需要和期望.解决实际发生的问题.管理利益冲突.促进干系人合理参与 项目决策和 ...

  2. margin与padding的区别与用法—以及出现bug的解决方法

    margin(外边距) padding(内边距)   一.语法结构 (1)margin-left:10px; 左外边距 (2)margin-right:10px; 右外边距 (3)margin-top ...

  3. [Luogu3420][POI2005]SKA-Piggy Banks

    题目描述 Byteazar the Dragon has NNN piggy banks. Each piggy bank can either be opened with its correspo ...

  4. ‎Cocos2d-x 学习笔记(21.1) ScrollView “甩出”效果与 deaccelerateScrolling 方法

    1. 简介 “甩出”效果是当我们快速拖动container并松开后,container继续朝原方向运动,但是渐渐减速直到停止的效果. ScrollView的onTouchEnded方法会设置Timer ...

  5. python学习-多线程并发

    1.线程与进程 通俗解释: 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进 ...

  6. 百万年薪python之路 -- 文件操作

    1.文件操作: f = open("zcy.txt" , mode="r" , encoding="UTF-8") open() 打开 第一 ...

  7. lable的渲染

    <StackPanel Margin=" TextOptions.TextFormattingMode="Display"> <Label TextOp ...

  8. SpringBoot学习(三)探究Springboot自动装配

    目录 什么是自动装配 何时自动装配 原理分析 注:以下展示的代码springboot的版本为2.0.3版.因源码过长,大家选择展开代码 ㄟ( ▔, ▔ )ㄏ 什么是自动装配 自动装配还是利用了Spri ...

  9. 基准测试了 ArrayList 和 LinkedList ,发现我们一直用 ArrayList 也是没什么问题的

    ArrayList 应该是 Java 中最常用的集合类型了,以至于我们说到集合就会自然而然的想到 ArrayList.很多同学都没有用过除了 ArrayList 之外的其他集合,甚至于都已经忘了除了 ...

  10. Catalan数的理解

    Catalan数的理解 f(0)=1 f(1)=1 f(2)=2 f(3)=5 f(4)=14 f(5)=42     f(2)=f(1)+f(1)   f(3)=f(2)+f(1)*f(1)*f(2 ...