单词拼接(dfs/回溯/递归)
//单词拼接
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
char s[];
int first, last;
}; node a[];
int degree_in[], degree_out[], m, order[];
bool used[]; int f()
{
int x1, x2, ans = , i;
x1 = x2 = ;
for (i = ; i < ; ++i)
{
if (abs(degree_in[i] - degree_out[i]) >= )
return -;
else if (degree_in[i] - degree_out[i] == )
x1++;
else if (degree_in[i] - degree_out[i] == -)
{
x2++;
ans = i;
}
}
if (x1> || x2 > ) //当时三个度时,必定是 12 和21,相同的不能大于等于2,不然不能构成欧拉回路
return -;
else if (x1 == )
{
for (i = ; i < ; ++i)
if (degree_out[i])
return i; //找到一个就行
}
else
return ans; }
bool cmp(node a, node b)
{
return strcmp(a.s, b.s) < ;
} bool dfs(int st, int cnt)
{
int i;
if (cnt == m)
return ;
for (i = ; i < m; ++i)
{
if (a[i].first < st || used[i])
continue;
else if (a[i].first > st)
return false;
used[i] = true;
order[cnt] = i;
if (dfs(a[i].last, cnt + ))
return ;
used[i] = false;//回溯判断是否形成欧拉路径
}
return false;
} int main()
{
int N, len, i, start;
scanf("%d", &N);
while (N--)
{
memset(used, false, sizeof(used));
memset(degree_out, , sizeof(degree_out));
memset(degree_in, , sizeof(degree_in));
scanf("%d", &m);
for (i = ; i < m; ++i)
{
scanf("%s", a[i].s);
len = strlen(a[i].s);
a[i].first = a[i].s[] - 'a';
a[i].last = a[i].s[len - ] - 'a';
degree_out[a[i].s[] - 'a']++;
degree_in[a[i].s[len - ] - 'a']++;//注意这里的入肚出度
}
start = f();
if (start == -)
{
printf("***\n");
continue;
}
sort(a, a + m, cmp);
if (!dfs(start, ))
{
printf("***\n");
continue;
}
printf("%s", a[order[]].s);
for (i = ; i < m; i++)
printf(".%s", a[order[i]].s);
printf("\n");
}
return ;
}
单词拼接(dfs/回溯/递归)的更多相关文章
- [LeetCode] 79. 单词搜索(DFS,回溯)
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
- leetcode 面试题 17.22. 单词转换(DFS+回溯)
题目描述 思路分析 这题回溯,先想出它的空间解是什么,这里空间解,其实就是给的原字符串到结束字符串中间的变形过程,那么就可以容易的画出一个解空间树,用深度搜索进行搜索, 剪枝后,进入下一个维度,再进行 ...
- [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)
39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...
- NYOJ 99单词拼接(有向图的欧拉(回)路)
/* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...
- 素数环(dfs+回溯)
题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...
- nyoj 99 单词拼接
点击打开链接 单词拼接 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...
- NYIST 99 单词拼接
单词拼接时间限制:3000 ms | 内存限制:65535 KB难度:5 描述给你一些单词,请你判断能否把它们首尾串起来串成一串.前一个单词的结尾应该与下一个单词的道字母相同.如 aloha dog ...
- Leetcode题目79.单词搜索(回溯+DFS-中等)
题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...
- 八皇后(dfs+回溯)
重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...
随机推荐
- canvas验证码实现
1 <!DOCTYPE html> <html> <!-- head --> <head> <meta charset="utf-8&q ...
- Java 之 IDEA 的 Debug 追踪
使用 IDEA 的断点调试功能,查看程序的运行过程. 1.在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 2.点击 Debug 运行模式 3.程序停止在断 ...
- menustrip选项怎么设置竖向分割线
效果图: 解决方案: 选中一个项--[右键]--[插入]--[separator]
- 服务器IP与个人IP的特点
服务器IP:系统类型.开放的端口及运行的服务.C段同类机器数量.是否机房.IDC服务商 个人IP:系统类型.开放的端口及运行的服务……
- js中的分页
分页是前端经常会用到的一个非常实用的一个知识点,今天闲来没事,做了一个小demo,虽然样子,比较丑,哈哈哈,但是这是分页的核心思想都在,希望能给某个小伙伴一些启发.可直接复制在编辑器中运行. < ...
- python3 模块和包
一.模块(Module)和包(Package) 1.模块:一个包含所有你定义的函数和变量的文件,其后缀名是 .py ,一个.py文件就是一个模块 2.包:一定包含 __init__.py模块 的文件夹 ...
- Python3+Appium学习笔记07-元素定位工具UI Automator Viewer
这篇主要说下如何使用UI Automator Viewer这个工具来定位元素.这个工具是sdk自带的.在sdk安装目录Tools目录下找到uiautomatorviewer.bat并启动它 如果启 ...
- Python多线程应用于自动化测试
Python多线程应用于自动化测试 将多线程在测试巧妙地应用,确实会带来很多好处,并且这是充分利用机器资源执行高效率测试很好的方式 # -*- coding: utf-8 -*- import thr ...
- Please, commit your changes or stash them before you can merge. Aborting
1.stash 通常遇到这个问题,你可以直接commit你的修改:但我这次不想这样. 看看git stash是如何做的. git stash git pull git stash pop ...
- HBuilderX 5+APP MUI 入门
这一套东西是用来开发app的,可以用html.js什么的写app然后给你打包就能安装到手机上,也可以轻易跨端(需要使用vue,然而我还没有熟练). HBuilder:一个敲代码的软件,敲前端代码超级方 ...