nyoj 99-单词拼接 (euler, dfs)
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 ;
}
nyoj 99-单词拼接 (euler, dfs)的更多相关文章
- NYOJ 99单词拼接(有向图的欧拉(回)路)
/* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...
- nyoj 99 单词拼接
点击打开链接 单词拼接 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...
- NYIST 99 单词拼接
单词拼接时间限制:3000 ms | 内存限制:65535 KB难度:5 描述给你一些单词,请你判断能否把它们首尾串起来串成一串.前一个单词的结尾应该与下一个单词的道字母相同.如 aloha dog ...
- 单词拼接(dfs/回溯/递归)
单词拼接传送门 //单词拼接 #include<stdio.h> #include<string.h> #include<algorithm> using name ...
- NYOJ 单词拼接
# include<iostream> # include<string> # include<string.h> # include<queue> # ...
- NOIP2000单词接龙[DFS]
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 单词接龙dfs洛谷
题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...
- 力扣算法题—079单词搜索【DFS】
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...
- P1101 单词方阵 简单dfs
题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单 ...
随机推荐
- PHP krsort
1.什么都不想说了,干么没事放那么悲伤的歌呢?回忆里我还是对代码懵懵懂懂的无知青年!也许不是青年,只是少年... <?php $arr = [ 1 => 'Zhangbiyu', 2 =& ...
- opencv::模糊图像
Smooth/Blur 是图像处理中最简单和常用的操作之一,使用该操作的原因之一就为了给图像预处理时候减低噪声 使用Smooth/Blur操作其背后是数学的卷积计算,通常这些卷积算子计算都是线性操作, ...
- python学习-模块与包(九)
9.4查看模块内容 dir(): 返回模块或类所包含的全部程序单元(包括变量.函数.类和方法等) __all__:模块本身提供的变量,不会展示以下划线开头的程序单元.另使用from xx import ...
- python编程系列---多个装饰器装饰一个函数的执行流程
首先看一个例子 ''' 多个装饰器装饰一个函数 ''' # 定义第一个装饰器 def set_func1(func): def wrapper1(*args,**kwargs): print('装饰内 ...
- Java8新特性 - Stream API
Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合进行操作,就类似与使用SQL执行的数据库 ...
- ESP8266开发之旅 网络篇⑭ web配网
1. 前言 目前,市面上流行多种配网方式: WIFI模块的智能配网(SmartConfig以及微信AirKiss配网) SmartConfig 配网方式 请参考博主之前的博文 ESP8266开 ...
- linux "No space left on device" 磁盘空间解决办法
某年某月某日某时,某人在工作中设置crontab定时任务规则保存时,提示“No space left on device”,此时用df -h检查磁盘,发现还有剩余空间.请问是什么原因及如何排查?什么会 ...
- Azure DevOps 替换 appsettings 解决方案
之前发布了 <.Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)>之后,有很多朋友私信我说如何替换 appsettings 里面的 ConnectionS ...
- web常用知识
Html 1.打电话,发短信和发邮件 <a href="tel:0755-10086">打电话给:0755-10086</a> <a href=&qu ...
- 别说家庭组开不了,一定成功的方法|win7家庭组无法开启|win7如何共享打印机
两台WIN7要开启家庭组并且共享打印机 这两台电脑必须打开以下服务:dnscache(任务管理器 简写).fdrespub(任务管理器 简写).(接下来下了都是服务里面的)SSDP Discovery ...