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 个方向的任一方向,同一单词摆放时不再改变方向,单词与单 ...
随机推荐
- 基于Opentracing+Jaeger全链路灰度调用链
当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...
- Dispatcher与UI线程交互
this.chart2.Dispatcher.BeginInvoke(new Action(() => { this.chart2.SetData("Series1", lx ...
- The usage of Markdown---代码块
目录 1. 序言 2. 代码块 3. 引用中的代码 4. 列表中的代码块 更新时间:2019.09.14 1. 序言 在写技术博客的时候,我们常常需要添加一下代码块用来做演示说明,实际上在这篇博客 ...
- Redis(十四)Redis 在Java Web 中的应用
在传统的 Java Web 项目中,使用数据库进行存储数据,但是有一些致命的弊端,这些弊端主要来自于性能方面. 由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般管理系统中,由于不存在高 ...
- Dotween 应用
dotween是做缓动比较简单实用的插件,下面就使用经验进行浅谈 1)通用方法:如下图官网截图所示,如果看不懂可以跳过,这是一个通用方法,前两个参数为委托类型,可以用lambda表达式,也可以直接写成 ...
- python小例子(三)
1.提高Python运行速度的方法 (1)使用生成器,节约大量内存: (2)循环代码优化,避免过多重复代码的执行: (3)核心模块使用cpython,pypy等: (4)多进程,多线程,协程: (5) ...
- 大家都说好用的 Python 命令行库:click
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- python str的一些操作及处理
一.str的定义:Python中凡是用引号引起来的数据可以称为字符串类型,组成字符串的每个元素称之为字符,将这些字符一个一个连接起来,然后在用引号起来就是字符串. 二.str的简单操作方法: conu ...
- Jquery动态bind绑定已有函数,函数自动执行的问题解决方法
在bind后面的方法,不能带括号,带括号函数就自动执行了... <script> //通过子元素删除某行 function deleteRow() { var flag = confirm ...
- javaScipt类定义和实现
最近在几个群上经常看到有人问在一个类里的一个 function 怎么调用 this. 定义后公开的方法.现发一篇类实现的随笔.首先说说类,在一个类里我们会有以下的几个特征:1. 公有方法2. 私有 ...