Play on Words-uva 精短欧拉回路

本文介绍了一种判断是否能通过给定的字符串集合构建回路的算法。该算法首先统计每个字符作为起始和终止字符的频率,再通过深度优先搜索(DFS)遍历所有可能的连接方式来确定是否可以形成闭环。

思路:先分析,特殊的字母,可能有的字母是当开头个数+1=当结尾个数,那么这个字母一定是开头,同理另一个特殊字母就是作为结尾的

之后其余的字母的话只可能是开头=结尾个数,如果有任何一个字母当开头的个数和结尾个数只差为2,那么回路一定不成立!

之后是构建DFS遍历

遍历的思路就是 用G[i][j]表示字母i,j是连通的!

遍历的起点我们分为2个步骤,一个是这个图是个环路

第二个是一条线性图

环路的话从哪里都可以开始遍历

线形图的话最好从开头进行遍历

一直遍历到结尾

之后看有没有没有遍历到的节点

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define LEN 100 + 10
#define MAX_SIZE  1000 + 10
int G[LEN][LEN];
int front[LEN];
int back[LEN];
int vis[LEN];
int dfs(int u)
{
    vis[u]=1;
    for(int i=0;i<LEN;i++)
        if(G[u][i]&&!vis[i])/*如果是连通的话*/
    {
        dfs(i);
    }
}
int main()
{
    int N;
    scanf("%d",&N);
    for(int cases=1;cases<=N;cases++)
    {
        int n,ok=1;
        scanf("%d",&n);
        memset(front,0,sizeof(front));
        memset(back,0,sizeof(back));
        memset(G,0,sizeof(G));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            char word[MAX_SIZE];
            scanf("%s",word);
            int L=strlen(word);
            G[word[0]-'0'][word[L-1]-'0']++;
            front[word[0]-'0']++;
            back[word[L-1]-'0']++;
        }
        int num1=0,num2=0;
        for(int i=0;i<LEN;i++)
        {
            if(front[i]!=back[i])
            {
                if(front[i]==back[i]+1)
                    num1++;
                else if(front[i]+1==back[i])
                    num2++;
                else
                {
                    ok=0;
                    break;
                }
            }
        }
        if(num1&&num2&&num1+num2>2)
        ok=0;
        if(ok){/*开头和结尾只能有一个*/
        /*开始遍历!*/
        int ok1=0;
        int ok2=0;
        for(int i=0;i<LEN;i++)
        {
            if(num1==0&&num2==0&&front[i])
            {
                /*如果是一个回路的图*/
                   dfs(i);
                   break;
            }
            else if(front[i]>back[i])
            {
                  dfs(i);
                   break;
            }
        }
        num1=0;num2=0;
        for(int i=0;i<LEN;i++)
        {
            if(!vis[i]&&front[i]){ok=0;break;}
            if(!vis[i]&&back[i]){ok=0;break;}
        }
        if(ok) printf("Ordering is possible.\n");
        else printf("The door cannot be opened.\n");
        }
        else printf("The door cannot be opened.\n");
    }
    return 0;
}


# 代码概述 将导航代码精简至最短,同时保留图标、文字及图片插入位置,便于后续替换为真实图片或适配响应式布局。 # 代码解析 ```html <!-- 导航区域:精简版,带图片插入点 --> <div class="nav-icons flex flex-wrap justify-between bg-white p-3"> <!-- 每个项使用统一结构,预留 img 插入位置 --> <a href="#" class="w-1/5 text-center py-3" title="民宿/客栈"> <img src="https://via.placeholder.com/50?text=住" alt="民宿/客栈" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">民宿/客栈</div> </a> <a href="#" class="w-1/5 text-center py-3" title="航班助手"> <img src="https://via.placeholder.com/50?text=飞" alt="航班助手" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">航班助手</div> </a> <a href="#" class="w-1/5 text-center py-3" title="汽车/船票"> <img src="https://via.placeholder.com/50?text=车" alt="汽车/船票" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">汽车/船票</div> </a> <a href="#" class="w-1/5 text-center py-3" title="门票/活动"> <img src="https://via.placeholder.com/50?text=票" alt="门票/活动" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">门票/活动</div> </a> <a href="#" class="w-1/5 text-center py-3" title="购物/免税"> <img src="https://via.placeholder.com/50?text=购" alt="购物/免税" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">购物/免税</div> </a> <a href="#" class="w-1/5 text-center py-3" title="美食"> <img src="https://via.placeholder.com/50?text=吃" alt="美食" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">美食</div> </a> <a href="#" class="w-1/5 text-center py-3" title="接送机/包车"> <img src="https://via.placeholder.com/50?text=接" alt="接送机" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">接送机</div> </a> <a href="#" class="w-1/5 text-center py-3" title="租车"> <img src="https://via.placeholder.com/50?text=租" alt="租车" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">租车</div> </a> <a href="#" class="w-1/5 text-center py-3" title="周边游"> <img src="https://via.placeholder.com/50?text=游" alt="周边游" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">周边游</div> </a> <a href="#" class="w-1/5 text-center py-3" title="借钱/分期"> <img src="https://via.placeholder.com/50?text=钱" alt="借钱" class="w-8 h-8 mx-auto"> <div class="text-gray-700 text-xs mt-1">借钱</div> </a> </div> ``` ### ✅ 精简说明: - **完全移除 `i` 标签和 Font Awesome**,改用 `<img>` 更通用; - **每个导航项仅用 4 行代码**,结构统一,易于批量替换; - **所有图片使用占位图链接**(如 `via.placeholder.com`),你只需替换 `src` 为真实图片地址即可; - **支持响应式**:`w-1/5` + `flex-wrap` 实现每行5个自动换行; - **轻量样式依赖**:若无 Tailwind,可用下方简易 CSS 替代: ```html <style> .nav-icons { display: flex; flex-wrap: wrap; justify-content: space-between; padding: 12px; background: white; } .nav-icons a { width: 20%; text-align: center; padding: 12px 0; color: #333; text-decoration: none; font-size: 12px; } .nav-icons img { width: 32px; height: 32px; margin: 0 auto; border-radius: 50%; object-fit: cover; } </style> ``` 这样既**极简又实用**,适合集成到移动端首页中。 # 知识点 - **Flex布局**:使用`display:flex`让元素水平排列并轻松实现对齐与分布。 - **Viewport设置**:通过`meta`标签控制网页在手机上的显示方式,防止自动缩放。 - **响应式设计原理**:利用百分比宽度和`max-width`使页面适应不同大小的屏幕。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值