10129 - Play on Words

描述:题意就是通过每行字符的第一个字母和最后一个字母看是否能够连成一串,我才用了欧拉回路判重的方法,不过要事先解决好是否能够构成回路,也就是说出度和入度问题,出度和入度如果完全相同,那么随便找一个点进行欧拉回路就可以;如果入度与出度相差超过了2(包含2),那么肯定无法来成一串;并且最多只能有两个节点的入度和出度分别呈现1和-1(要么没有),才可以连成一串。明白了这些后,然后就可以写代码了,希望你能一次AC!!

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int flag,visit[27],s[27][27];
void dfs(int num)
{
    visit[num]=0;;
    for(int i=0; i<26; i++)
        if(visit[i]&&s[num][i]) dfs(i);
}
int main()
{
    //freopen("a.txt","r",stdin);
    int n,m,site;
    int s_row[27],s_col[27];
    char str[1010];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(int i=0; i<26; i++) s_row[i]=s_col[i]=visit[i]=0;
        memset(s,0,sizeof(s));
        getchar();
        while(m--)
        {
            memset(str,0,sizeof(str));
            gets(str);
            s_row[str[0]-'a']++;
            int c=strlen(str)-1;
            s_col[str[c]-'a']++;
            visit[str[0]-'a']++;
            visit[str[c]-'a']++;
            s[str[0]-'a'][str[c]-'a']=1;
            site=str[0]-'a';
        }
        int in,out;
        flag=in=out=0;
        for(int i=0; i<26; i++)
            if(s_row[i]-s_col[i]==-1) in++;
            else if(s_row[i]-s_col[i]==1)
            {
                out++;
                site=i;
            }
            else if(s_row[i]-s_col[i]!=0) flag=1;
        if(flag)
        {
            printf("The door cannot be opened.\n");
            continue;
        }
        if((!in&&!out)||(in==1&&out==1)) dfs(site);
        for(int i=0; i<26; i++) flag+=visit[i];
        if(flag) printf("The door cannot be opened.\n");
        else printf("Ordering is possible.\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值