单词拼接传送门

//单词拼接
#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. numix Docky

    今天我们介绍这款主题适用于 Docky 启动器的 numix 主题,关于 Docky 大家已经应该很熟悉了,一款类似 Mac 底部软件停放的快捷启动码头.如图: 这款主题是 Docky 的主题,如果你 ...

  2. Lua 可变参数 ... 的一点测试

    function test( ... ) if (...) then dibug("has ...") else dibug("no ...") end for ...

  3. 一步一步教你实现iOS音频频谱动画(二)

    如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第一篇:一步一步教你实现iOS音频频谱动画(一) 本文是系列文章中的第二篇,上篇讲述了音频播放和频谱数据计算,本篇讲 ...

  4. springload热更新的优缺点

    java开发web应用没有.net的方便快捷, 原因是传统开发模式下新增修改代码后要查看效果, 一般要重启应用, 导致浪费了许多无谓的时间,没有.net的高效, 任意更新文件实时生效. 但是有个叫sp ...

  5. 关于一个socket在阻塞模式下是否还可以使用的实验

    想到一个socket在多线程模式下,是否可以同时使用的问题,比如socket A阻塞在recv,而别的线程用socket A send是否能成功,下面上实验代码 void thread_socket( ...

  6. Jmeter(一)非GUI模式压测(NON-GUI模式)结果解析TPS

    非GUI模式压测(NON-GUI模式)结果解析TPS 准备工作 从脚本已录制成功之后开始进行压测 安装Jmeter拓展插件 查看 Transactions per Second https://jme ...

  7. sql语句中的占位符?有什么作用

    String sql = "SELECT userid,name FROM tuser WHERE userid=? AND password=?" ; pstmt = conn. ...

  8. Vue -- element-ui FileSaver.js 导出

    html <el-button type="danger" @click="exportRs">导出Excel报表</el-button> ...

  9. list 对像排序

    在C#的List操作中,针对List对象集合的排序我们可以使用OrderBy.OrderByDescending.ThenBy.ThenByDescending等方法按照特定的对象属性进行排序,其中O ...

  10. Java锁机制总结

    锁是用于控制多线程对共享资源的访问. Java中的锁可以分为内置锁与显式锁Lock.其中内置锁指synchronized关键字. Synchronized synchronized可以修饰方法或代码块 ...