Play on Words
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 10685   Accepted: 3625

Description

Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there is no other way to open the doors, the puzzle is very important for us.

There is a large number of magnetic plates on every door. Every
plate has one word written on it. The plates must be arranged into a
sequence in such a way that every word begins with the same letter as
the previous word ends. For example, the word ``acm'' can be followed by
the word ``motorola''. Your task is to write a computer program that
will read the list of words and determine whether it is possible to
arrange all of the plates in a sequence (according to the given rule)
and consequently to open the door.

Input

The
input consists of T test cases. The number of them (T) is given on the
first line of the input file. Each test case begins with a line
containing a single integer number Nthat indicates the number of plates
(1 <= N <= 100000). Then exactly Nlines follow, each containing a
single word. Each word contains at least two and at most 1000 lowercase
characters, that means only letters 'a' through 'z' will appear in the
word. The same word may appear several times in the list.

Output

Your
program has to determine whether it is possible to arrange all the
plates in a sequence such that the first letter of each word is equal to
the last letter of the previous word. All the plates from the list must
be used, each exactly once. The words mentioned several times must be
used that number of times.

If there exists such an ordering of plates, your program should
print the sentence "Ordering is possible.". Otherwise, output the
sentence "The door cannot be opened.".

Sample Input

3
2
acm
ibm
3
acm
malform
mouse
2
ok
ok

Sample Output

The door cannot be opened.
Ordering is possible.
The door cannot be opened.

Source

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int edge[][];
struct node{
int in,out;
}que[];
int vis[];
char str[];
int cnt_dfs; void dfs(int u){
vis[u]=;
for(int i=;i<;i++)
if(!vis[i]&&edge[u][i])
dfs(i); cnt_dfs++;
} int main(){
int T;
scanf("%d",&T); while(T--){
int n;
scanf("%d",&n);
memset(edge,,sizeof(edge));
memset(vis,,sizeof(vis));
memset(que,,sizeof(que));
int u,v;
// getchar(); for(int i=;i<=n;i++){ scanf("%s",str);
// getchar();
int len=strlen(str);
u=str[]-'a';
v=str[len-]-'a';
que[u].out++;
que[v].in++;
edge[u][v]=edge[v][u]=; } int cnt=,temp=;
// bool flag=false;
for(int i=;i<;i++){
if(que[i].in||que[i].out){
if(!temp){ temp=i;
}
cnt++;
}
}
// printf("--->%d\n",temp);
cnt_dfs=;
dfs(temp);
// printf("-->%d %d\n",cnt,cnt_dfs); if(cnt_dfs!=cnt){
printf("The door cannot be opened.\n");
continue;
}
// bool flag=false;
int cnt_s=,cnt_e=,cnt_m=;
cnt=;
for(int i=;i<;i++){
if(que[i].in==&&que[i].out==)
continue;
cnt++;
if(que[i].in==que[i].out)
cnt_m++;
else if(que[i].in-que[i].out==-)
cnt_s++;
else if(que[i].in-que[i].out==)
cnt_e++;
} if(cnt_m==cnt||(cnt_m==cnt-&&cnt_s==&&cnt_e==))
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n"); }
return ;
}

最新文章

  1. Javascript之匿名函数
  2. asp.net mvc 绑定客户端post过来的复杂JSON数据
  3. iTerm 2 &amp;&amp; Oh My Zsh
  4. SpringMVC4零配置--web.xml
  5. 不同环境下文件上传Uncaught SyntaxError: Unexpected end of input
  6. TID大会学习心得之敏捷软件架构-微服务
  7. log4net 既要按日期分割日志文件,又要按文件大小分割。
  8. 利用SecondaryNameNode文件恢复Namenode-实践可行
  9. CSS3 background-size图片自适应
  10. 使用 Nginx 创建服务器的负载均衡
  11. Ubuntu在构建Robotframework+Selenium周围环境
  12. JavaScript原生拖放API入门总结
  13. Mysql实现树形递归查询
  14. org.apache.subversion.javahl.ClientException: Previous operation has not finished
  15. Spring Boot中使用AOP统一处理Web请求日志
  16. 图解HTTP笔记
  17. 安装ubuntu的坑&amp;RHEL7配置
  18. 利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验
  19. mybatis学习五 log4j
  20. 用活firewalld防火墙之service

热门文章

  1. linux 命令——21 find(转)
  2. Linux运维工程师是什么鬼?
  3. 2018.2.3 Centos 的vim好看的主题配置及JDK的安装配置
  4. bootstrap table 自定义checkbox样式
  5. Activiti学习记录(五)
  6. latex-word
  7. POJ 2774 后缀数组 || 二分+哈希
  8. Java 获取Web项目相对webapp地址
  9. 七、Shell printf 命令
  10. SQL Server中的日期,时间组合查询