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. 1,下载和部署开发环境--AutoCAD二次开发

    环境需求为: AutoCAD 2020版 ObjectARX SDK 下载地址:https://www.autodesk.com/developer-network/platform-technolo ...

  2. vue实现跑马灯效果

    vue实现跑马灯效果为阿中哥哥应援 1.效果图 2.实现代码 <!DOCTYPE html> <html lang="en"> <head> & ...

  3. Excel接口导出,导入数据库(.Net)

    public ActionResult TestExcel(string filePath) { return View(); } /// <summary> /// 根据Excel列类型 ...

  4. 从Go语言编码角度解释实现简易区块链——实现交易

    在公链基础上实现区块链交易 区块链的目的,是能够安全可靠的存储交易,比如我们常见的比特币的交易,这里我们会以比特币为例实现区块链上的通用交易.上一节用简单的数据结构完成了区块链的公链,本节在此基础上对 ...

  5. kali更新源地址更改

    问题: Hit:1 http://mirrors.ustc.edu.cn/kali kali-rolling InReleaseIgn:2 http://mirrors.ustc.edu.cn/kal ...

  6. 使用haproxy实现负载均衡集群

    一.HAProxy概述: HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.根据官方数据,其最高极限支持10G的并发. HAP ...

  7. windows一键还原,阴影卷创建报错,shadowcopy error - User Imposed Limit

    windows 系统自带的还原备份功能,底层使用 shadowcopy(阴影卷)技术. 该技术采用了 copy on write 的方式, 当每次有新 IO 时,老的数据会被拷贝出来,然后再写新的 I ...

  8. access技巧 access源码 这里都可找到哦

    这个网站不错,有很多access技巧 access源码 还有access公开课 access免费培训 access教程 大家要多看看哦: http://www.office-cn.net access ...

  9. Flask:Flask中使用会话技术

    1.会话技术cookie和session (1)cookie 在网站中,HTTP请求是无状态的.也就是说,即使第一次用户访问服务器并登录成功后,第二次请求服务器依然不知道当前发起请求的是哪个用户.co ...

  10. 《JavaScript设计模式与开发实践》-- 策略模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-celue/ 策略模式 1.定义 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们 ...