单词拼接传送门

//单词拼接
#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/回溯/递归)的更多相关文章

  1. [LeetCode] 79. 单词搜索(DFS,回溯)

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  2. leetcode 面试题 17.22. 单词转换(DFS+回溯)

    题目描述 思路分析 这题回溯,先想出它的空间解是什么,这里空间解,其实就是给的原字符串到结束字符串中间的变形过程,那么就可以容易的画出一个解空间树,用深度搜索进行搜索, 剪枝后,进入下一个维度,再进行 ...

  3. [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)

    39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...

  4. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  5. 素数环(dfs+回溯)

    题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...

  6. nyoj 99 单词拼接

    点击打开链接 单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...

  7. NYIST 99 单词拼接

    单词拼接时间限制:3000 ms | 内存限制:65535 KB难度:5 描述给你一些单词,请你判断能否把它们首尾串起来串成一串.前一个单词的结尾应该与下一个单词的道字母相同.如 aloha dog ...

  8. Leetcode题目79.单词搜索(回溯+DFS-中等)

    题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...

  9. 八皇后(dfs+回溯)

    重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...

随机推荐

  1. cookie和session,sessionStorage、localStorage和cookie的区别

    1.cookie 含义: 存储在访问者的计算机中的变量,即存储在客户端 创建一个cookie /* getCookie方法判断document.cookie对象中是否存有cookie,若有则判断该co ...

  2. 面试题之String s="a"+"b"+"c"+"d";

    今天遇到了一个面试题的选择,我当时真的没怎么在意,其实挺好玩的. 1.这条语句String s="a"+"b"+"c"+"d&qu ...

  3. uni-app入门学习

    什么是 uni-app 1 uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS.Android.H5.小程序等多个平台. 官方的体验例子: 2 un ...

  4. mac下自己实现re-sign.jar对apk进行重签名

    利用Robotinum对给的apk文件进行自动化测试,在不知道源码的情况下,只有apk文件如何进行自动化测试呢? 首先需要对apk文件进行重签名,并获得该apk文件的包名和程序入口的类名. 最开始网上 ...

  5. Microsoft 中间语言

  6. LVM——基本概念

    介绍 LVM(Logical Volume Management)是一种存储设备管理技术,它赋予用户权力,汇集和抽象物理存储设备,从而实现更轻松,更灵活的管理. 利用device mapper这个Li ...

  7. SQL JOB实现数据库同步

    数据库同步是一种比较常用的功能.以下结合我自己的体会整理的,如果有理解不完全或者有误的地方望大牛不理赐教.下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据 ...

  8. django考点

    django考点 1 列举Http请求中常见的请求方式2 谈谈你对HTTP协议的认识.1.1 长连接3 简述MVC模式和MVT模式4 简述Django请求生命周期5 简述什么是FBV和CBV6 谈一谈 ...

  9. Selenium(二)开发环境的搭建

    1.安装python的开发集成环境 我之前有写,可参考https://www.cnblogs.com/dydxw/p/10405797.html 2.使用selenium打开火狐浏览器 先从selen ...

  10. python_网络编程struct模块解决黏包问题

    为什么会出现黏包现象: 首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制来避免数据丢失,因此,在连续发送小数据的时候,以及接收大小不符的时候 ...