单词拼接

时间限制:3000 ms  |  内存限制:65535 KB
难度: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
***
来源
Waterloo local 2003.01.25 /POJ
上传者

张云聪

这道题就是判断是否有欧拉路,然后输出欧垃迹,中间的数据处理有些麻烦,将单词掐头去尾,记录入度出度,因为最多用到26个字母,所以如果一个字母的入度和出度相差2或者更多,就不会有欧垃路,如果入度出度相差为一的字母数超过1,也不会有欧拉路,如果有,那麽就开始dfs,dfs找的时候从一个度数为奇数的点开始,知道全部找完,那么就输出欧垃迹,否则就是不存在

<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
char s[30];
int f,l;
}word[1010];
int in[1010],out[1010],vis[1010],order[1010],m;
int f()
{
int x1,x2,ans=0;
x1=x2=0;
for(int i=0;i<26;i++)
{
if(abs(in[i]-out[i])>=2)
return -1;
else if(in[i]-out[i]==1)
x1++;
else if(in[i]-out[i]==-1)
{
x2++;
ans=i;
}
}
if(x1>1||x2>1)
return -1;
else if(x1==0)
{
for(int i=0;i<26;i++)
if(out[i])
return i;//因为我记录的出度是一个最后一个字母,所以从这儿开始dfs
}
else
return ans;
}
int cmp(node a,node b)
{
return strcmp(a.s,b.s)<0;
}
bool dfs(int st,int cnt)
{
if(cnt==m)
return 1;
for(int i=0;i<m;i++)
{
if(word[i].f<st||vis[i])
continue;
else if(word[i].f>st)
return false;
vis[i]=1;
order[cnt]=i;
if(dfs(word[i].l,cnt+1))
return 1;
vis[i]=0;
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&m);
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(order,0,sizeof(order));
for(int i=0;i<m;i++)
{
scanf("%s",word[i].s);//单词掐头去尾,记录入度出度
int l=strlen(word[i].s);
word[i].f=word[i].s[0]-'a';
word[i].l=word[i].s[l-1]-'a';
in[word[i].l]++;
out[word[i].f]++;
}
int start=f();
if(start==-1)
{
printf("***\n");
continue;
}
sort(word,word+m,cmp);
if(!dfs(start,0))
{
printf("***\n");
continue;
}
printf("%s",word[order[0]].s);
for(int i=1;i<m;i++)
printf(".%s",word[order[i]].s);
printf("\n");
}
return 0;
}


nyoj--99--单词拼接(欧垃图判定+输出)的更多相关文章

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

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

  2. nyoj 99 单词拼接

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

  3. NYIST 99 单词拼接

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

  4. POJ 1386 欧拉路的判定

    题意:       给你n个单词,问你有没有一种排列方式可以所有单词的首部是相邻单词的尾部. 思路:       这个题目还挺基础的,就是个欧拉的判定,首先对于每一个单词,我们把他抽象成边,每个单词两 ...

  5. bzoj 1242: Zju1015 Fishing Net 弦图判定

    1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 214  Solved: 81[Submit ...

  6. [bzoj1242] Zju1015 Fishing Net弦图判定

    弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...

  7. 单词拼接(dfs/回溯/递归)

    单词拼接传送门 //单词拼接 #include<stdio.h> #include<string.h> #include<algorithm> using name ...

  8. 【Linux】利用Xvfb关闭chrome的图形化输出

    利用Xvfb关闭chrome的图形化输出 #!/bin/bash . /home/fzuir/.profile # JAVA export JAVA_HOME=/usr/local/jdk1.7.0_ ...

  9. C# 图片流下载;图片流输出

    图片流下载 string filePath = HttpContext.Current.Server.MapPath("/img/wxPic/"); if (!Directory. ...

随机推荐

  1. JS 经验总结

    1.IE中div的高度是content+padding+border之和,其它的是content的高度 2.一个标签里面只有一个属性,class='cls1 cls2' 3.同一页面不能出现相同的id ...

  2. CI中的数据库操作以及AR连贯操作

    要使用CI中的数据库操作,首先我们应该在CI的 application/config/databass.php 文件中配置数据库信息,通常就是配置主机名,用户名,密码,数据库名,表前缀(dbprefi ...

  3. Python matplotlib库

    安装日期:2017.9.7 版本不太清楚,为啥嘞? 从python2到python3,还有在学的tensorflow,版本一更新就会有之前的代码不能用了.学习的时候用别人的代码各种出错,查了半天发现那 ...

  4. INFORMIX MATCHES的使用详解

    MATCHES  运算符返回 TRUE ,如果一个字符串与给定的掩码匹配. 语法 expr  [NOT]  MATCHES  mask   [ ESCAPE "char" ] ex ...

  5. Android学习——利用RecyclerView编写聊天界面

    1.待会儿会用到RecyclerView,首先在app/build.gradle(注意有两个build.gradle,选择app下的那个)当中添加依赖库,如下: dependencies { comp ...

  6. Teamwork-六月上旬心得体会

    六月上旬心得体会 在五月末的时候,老师针对我们团队的状况提出了几点建议和解决方案,而这半个月里,我们尝试性地运用了其中的几件工具与方法. 1.燃尽图与每日总结 我们采用的是<构建之法>书中 ...

  7. JQuery学习笔记系列(二)----

    jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).其中也提供了很多函数来更加简洁的实现复杂的功能. 事件切换函数toggle ...

  8. jsoup解析页面

    package com.java.jsoup; /** * jsoup解析网页 * @author nidegui * @version 2019年4月29日 下午5:12:02 * */ impor ...

  9. 【leecode】独特的电子邮件地址

    每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 alice@leetcode.com中, alice 是本地名称,而 leetcode.com 是域名. 除了小写字母,这些电 ...

  10. input type=”file“ change事件只执行一次的问题

    js解决办法 HTML:<input id="file",type="file" onchange="upload()" /> ...