uva 10054 - The Necklace

本文介绍了一种解决项链珠子连接成环的问题的方法,通过判断输入数据是否构成欧拉回路并输出一种可能的路径。使用无向图邻接矩阵进行路径搜索,并通过递归与栈实现路径的输出。

点击打开链接


题目意思:有一堆散落的项链的的珠子,珠子有可能重复的出现,问我们能否连接成一条项链,要求该项链的每一节的两个珠子要满足,“第一个珠子必须和前一节的第二个珠子相同,对于最后一节的第二个珠子必须和第一节的第一个相同“。问能否实现,如果可以输出其中一种路径



解题思路:题目意思是判断是否可以连乘一个环,满足欧拉回路的条件,那么题目就转化为给个一个欧拉路判断是否是连通。我们知道对于判断欧拉道路是否是连通的我们都是采用建立一个无向图的邻阶矩阵,然后输出操作

第一步:任何一条欧拉回路满足所有的度数和为偶数,那么先判断是否满足该条件,不满足直接退出

第二步:我么在邻阶矩阵map中找到一个有出度的点进行路径搜索 , 对于路径的输出,我们一般用递归,利用栈来存储节点的坐标,最后逆序输出。


代码:

//对于项链是否可以满足索给的条件,那么我们先判断输入的数据是否是欧拉回路,即度数的和是否全部为偶数,如果是我们再去打印出一条路径
#include <iostream>
#include <cstdio>
#include <cctype>
#include <stack>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 60;
//结构体存储两个对应的坐标
struct node{
    int x;
    int y;
};
node p;
int t , n;
int map[MAXN][MAXN];//无向图的邻阶矩阵(搜索路径或判断连通都要用无向图的邻阶矩阵)
int eur[MAXN];//存储每个节点的度数
int flag;
stack<node>s;//栈用来存储节点的坐标
//
inline void output(int u){
    for(int i = 0 ; i <= 50 ; i++){
        if(map[u][i]){
            --map[u][i];//相应点减1
            --map[i][u];
            output(i);//继续向下搜索
            node temp;
            temp.x = u ; temp.y = i;
            s.push(temp);//把点压入栈中(逆序输出)
        }
    }
}
//
inline void solve(){
    int i , j , temp;
    temp = 0;
    for(i = 1 ; i <= 50 ; i++){
        for(j = 1; j <= 50 ; j++){
            if(map[i][j]){
                output(i);//找到有出度的点开始搜索路径
                temp = 1;
                break;//直接跳出
            }
        }
        if(temp)
            break;//直接跳出
    }
    while(!s.empty()){//输出结果
        node temp = s.top();
        printf("%d %d\n" , temp.x , temp.y);
        s.pop();
    }
}
//
int main(){
    int i , k;
    int x , y;
    scanf("%d" , &t);
    for(k = 1 ; k <= t ; k++){
        scanf("%d" , &n);
        flag = 1;
        memset(map , 0 , sizeof(map));
        memset(eur , 0 , sizeof(eur));
        for(i = 0 ; i < n ; i++){
            scanf("%d%d" , &x , &y);
            map[x][y]++;//邻阶矩阵的建立
            map[y][x]++;
            eur[x]++;//度数加1
            eur[y]++;
        }
        for(i = 0 ; i <= 50 ; i++){//判断满足欧拉回路
            if(eur[i] %2 != 0){
                flag = 0;
                break;
            }
        }
        printf("Case #%d\n" , k);
        if(flag == 0)//不满足欧拉回路直接输出
            printf("some beads may be lost\n");
        else
            solve();
        if(k != t)
            printf("\n");//最后没有空行
    }
    return 0;
}






基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值