单词游戏

https://loj.ac/problem/10106

题目描述

  给出n个单词,问能否完成所有单词的单词接龙。

思路

  如果以单词为节点,条件为边建图,我们就要在图上求是否存在一条哈密尔顿道路,这显然难以实现。我们考虑以单词为边,以字母为节点,那么题目就相当于在图上求一条欧拉道路,但我们并不知道图是否是一张连通图,非连通图显然无法找到一条欧拉路径。所以我们还要再尝试找一遍欧拉路径来判断是否连通。而找欧拉路径容易造成栈溢出,所以我们可以递归改循环。当然用并查集判连通性也可以。

#include <bits/stdc++.h>
using namespace std;
const int N=30,M=1e5+10;

int nxt[M],to[M],tot,head[N];
void add_edge(int x,int y)
{
    nxt[++tot]=head[x];
    head[x]=tot;
    to[tot]=y;
}

int read()
{
    int res=0,w=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)w=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=(res<<3)+(res<<1)+ch-‘0‘;ch=getchar();}
    return res*w;
}

int st[M],top;
bool vis[M];
void euler(int s)
{
    st[++top]=s;
    while(top>=1)
    {
        int x=st[top],i=head[x];
        while(i&&vis[i])i=nxt[i];
        if(i)
        {
            st[++top]=to[i];
            head[x]=nxt[i];
            vis[i]=1;
        }
        else
            --top;
    }
}

char s[1100];
int in[30],out[30];
int main()
{
    int t=read();
    while(t--)
    {
        memset(head,0,sizeof(head));
        memset(vis,0,sizeof(vis));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        top=0;tot=0;
        int n=read();
        for(int i=1;i<=n;i++)
        {
            scanf(" %s",s);
            int x=s[0]-‘a‘+1,y=s[strlen(s)-1]-‘a‘+1;
//            cout<<x<<‘ ‘<<y<<endl;
            in[y]++;out[x]++;
            add_edge(x,y);
        }
        bool f=1;
        int cnt1=0,cnt2=0,st=1;
        for(int i=1;i<=26;i++)
        {
            if(in[i]-out[i]==1)cnt1++;
            else if(out[i]-in[i]==1)cnt2++,st=i;
            else if(out[i]!=in[i])f=0;
            if(cnt1>1||cnt2>1)f=0;
        }
        euler(st);
        for(int i=1;i<=n;i++)
            if(!vis[i]){f=0;break ;}
        if(f)printf("Ordering is possible.\n");
        else printf("The door cannot be opened.\n");
    }
}

代码

原文地址:https://www.cnblogs.com/fangbozhen/p/11748550.html

时间: 2024-10-07 08:46:29

单词游戏的相关文章

模拟猜单词游戏

模拟实现猜单词游戏,纯模拟,不涉及图形界面,注释很详细,虽然本人代码写得丑,但是希望可以给大家提供帮助 #include<algorithm> #include<cstdlib> #include<cstring> #include<fstream> #include<ctime> #include<cmath> #include<iomanip> #include<windows.h> using names

DOM练习小记--简单的拼单词游戏

(资料源自<Head First Ajax>第七章) 书中另一个单页游戏案例,综合了DOM和事件处理,先总结一下页面布局和js编程的思路.涉及到服务端交互的暂时按下,毕竟还没有自己把服务端环境搭起来. 1) 内容简介 书中给的样本页面和样式是布置好的,初始静态页面如下: 4row*4col布局,每次初始化都会随机出现16个字母图片: 点击任意字母会把对应字母输入到旁边字母框中,每次提交前每个字母只能点击一次: 需要拼出一个合法的单词,OK后点击submit提交(Ajax): 如果合法则在分数框

P1278 单词游戏 - DFS

P1278 单词游戏 传送门 Sol: 枚举词典中的每个单词,然后跑DFS.再加个记忆化就不会T了. AC Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 16 + 4,M = 100 + 10; int n; char S[N][M]; int len[N]; int f[N][1<<N]; int dfs(int

P1278 单词游戏

状态压缩,用二进制来保存状态 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 string words[17]; 5 int rem[17][70000];//末尾是第i个单词的时候,用了集合是j的元素 6 int ans; 7 int dfs(int now,int book) 8 { 9 if(rem[now][book]!=-1)return rem[now][book]; 10 rem[now][book]=0;

单词游戏-基于SQLite+Qt的C++项目

SQLite文件数据库的操作 Qt插件的安装配置 1.VS2008下安装Qt开发包 解压缩4.7.3.rar到C:\Qt\4.7.3\ Qt for VS addin2.安装并配置Visual Assist X 重点难点1,连接SQLite文件数据库并操作 重点难点2:Qt界面GUI编程的操作 代码太绕,太杂,暂时不贴! C++

单词挑战设计0.1

Outline 先给出我总结的小组讨论之后的情况,然后给出简单的设计介绍. Conconlusion of Discussion, 2015.11.08 1.极关键的问题:组员或多或少都疑虑改动API的时间成本.难度,导致我们Brain Storm没那么富有创新 2.一致意见:按照baseline要求开发,不加入API改动级别的feature. 3.我观察了App商店现有的词典,发现几条重要反馈 同步 主题颜色 所以我们在准备设计之前还有困惑:我们的单词挑战, 1.以后随着“登录同步”功能的加入

A.探路者——贪吃蛇游戏(测评人:黄泽宇)

一.基于NABCD评论作品,及改进建议 每个小组评论其他小组Alpha发布的作品:1.根据(不限于)NABCD评论作品的选题:2.评论作品对选题的实现效果:3.就现有技术和工作量,不改变选题的主要方向,为该作品在beta版本可增减的功能提出改进意见. 1.根据(不限于)NABCD评论作品的选题. 根据探路者的Alpha发布选题背景及意义进行考量: 贪吃蛇游戏团队的选题背景及意义 NABCD标准考量 贪吃蛇作为一个经典的游戏,设计简单,实用和娱乐性高.对于贪吃蛇传统的玩法,大家众所周知,即:玩家通

Diameter协议

Diameter是计算机网络中使用的一个认证.授权和审计协议.它从功能更少的RADIUS协议进化而来,并且取代之. Dimater应用通过添加新的命令或属性扩展基础协议,例如使用扩展认证 协议(EAP). 与RADIUS协议比较 名字是一个单词游戏(从RADIUS,半径到DIAMETER,直径),从前任RADIUS协议演化而来(直径是半径的二倍).Diameter不直接后向兼容,但是提供RADIUS升级路径.DIAMETER提供的主要特征(RADIUS中缺乏的)有: * 可靠传输协议(TCP或S

cs106a编程方法学作业解答(4)(Hangman)

我发现assignment4有两种版本,除了上篇文章写的Yahtzee游戏,还有一种要求写一个叫做hangman的猜单词游戏的版本.大概是同一课程不同年份的内容有些出入的原因.这个作业我也做了.代码如下: 首先是Hangman.java的 /* * File: Hangman.java * ------------------ * This program will eventually play the Hangman game from * Assignment #4. */ import