ACM单词拼接
来源:互联网 发布:淘宝买宠物狗 编辑:程序博客网 时间:2024/05/21 22:35
单词拼接
- 描述
给你一些单词,请你判断能否把它们首尾串起来串成一串。
前一个单词的结尾应该与下一个单词的道字母相同。
如
aloha
dog
arachnid
gopher
tiger
rat
可以拼接成:aloha.arachnid.dog.gopher.rat.tiger
- 输入
- 第一行是一个整数N(0<N<20),表示测试数据的组数
每组测试数据的第一行是一个整数M,表示该组测试数据中有M(2<M<1000)个互不相同的单词,随后的M行,每行是一个长度不超过30的单词,单词全部由小写字母组成。 - 输出
- 如果存在拼接方案,请输出所有拼接方案中字典序最小的方案。(两个单词之间输出一个英文句号".")
如果不存在拼接方案,则输出
*** - 样例输入
26alohaarachniddoggopherrattiger3oakmapleelm
- 样例输出
aloha.arachnid.dog.gopher.rat.tiger***
- 来源
Waterloo local 2003.01.25 /POJ
个人理解:本题是欧拉回路和欧拉问题,首先遍历单词,记录下每个单词的首尾字母,进而利用回溯法来判断这几个单词是否能够实现欧拉回路或欧拉通路
代码如下C语言
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
char s[31];
int first, last;
};
node a[1001];
int degree_in[1001], degree_out[1001], m, order[1001];
bool used[1001];
int f()
{
int x1, x2, ans = 0, i;
x1 = x2 = 0;
for (i = 0; i < 26; ++i)
{
if (abs(degree_in[i] - degree_out[i]) >= 2)
return -1;
else if (degree_in[i] - degree_out[i] == 1)
x1++;
else if (degree_in[i] - degree_out[i] == -1)
{
x2++;
ans = i;
}
}
if (x1>1 || x2 > 1)
return -1;
else if (x1 == 0)
{
for (i = 0; i < 26; ++i)
if (degree_out[i])
return i;
}
else
return ans;
}
bool cmp(node a, node b)
{
return strcmp(a.s, b.s) < 0;
}
bool dfs(int st, int cnt)
{
int i;
if (cnt == m)
return 1;
for (i = 0; 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 + 1))
return 1;
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, 0, sizeof(degree_out));
memset(degree_in, 0, sizeof(degree_in));
scanf("%d", &m);
for (i = 0; i < m; ++i)
{
scanf("%s", a[i].s);
len = strlen(a[i].s);
a[i].first = a[i].s[0] - 'a';
a[i].last = a[i].s[len - 1] - 'a';
degree_out[a[i].s[0] - 'a']++;
degree_in[a[i].s[len - 1] - 'a']++;
}
start = f();
if (start == -1)
{
printf("***\n");
continue;
}
sort(a, a + m, cmp);
if (!dfs(start, 0))
{
printf("***\n");
continue;
}
printf("%s", a[order[0]].s);
for (i = 1; i < m; i++)
printf(".%s", a[order[i]].s);
printf("\n");
}
return 0;
}
- ACM单词拼接
- 单词拼接
- 单词拼接
- 单词拼接
- 单词拼接
- 单词拼接
- http://acm.nyist.net/JudgeOnline/problem.php?pid=99&&单词拼接
- 单词拼接 搜索
- NYOJ99 单词拼接
- nyoj 99 单词拼接
- NYOJ 99 单词拼接
- NYOJ 99 单词拼接
- NYOJ99 单词拼接
- nyoj99-单词拼接【欧拉图】
- NYOJ 单词拼接
- NYOJ 99 - 单词拼接
- NYOJ99单词拼接
- NYOJ99单词拼接
- react绑定事件
- InstantClient安装使用
- java.util.HashMap中的key为对象的问题,对象key获得相应的value值
- iOS_身份证号码校验
- 德国启用含有RFID芯片的新型身份证
- ACM单词拼接
- UVA 120Stacks of Flapjacks
- 51 nod 1574 排列转换(思维 贪心)
- Chrome开发者工具详解(1)-Elements、Console、Sources面板 Chrome开发者工具面板
- 归并排序(递归实现)
- SpringMVC4.* @ResponseBody 中文乱码无法解决
- iOS开发之网络音乐播放器(SC音乐)(一)
- 2. Add Two Numbers
- android编程中用到的小功能集合(持续更新)