力扣399【除法求值】【并查集】

本文介绍了如何利用并查集解决LeetCode第399题,即根据给定的先验条件合并集合,并进行除法运算求值。在实现中,初始化每个节点为自己的父节点,通过`find`函数递归查找根节点并进行树扁平化。`Union`函数用于合并集合,并更新权重。在解答过程中应注意集合合并和查找的正确性,确保结果准确。

力扣399【除法求值】【并查集】

在这里插入图片描述

  • 思路
    1) 初始化映射,每个节点的父节点都是自己
    2) 根据输入的先验条件合并集合的union函数
    3)查找节点的父节点函数find,与此同时需要将树扁平化,改变搜索过程中经过的节点父节点为根节点,并更新权重
    在这里插入图片描述
    这里使用递归进行查找
  • code
    //寻找父亲根节点
    string find(string str)
    {
        if (MP1[str] != str)
        {
            string origin = MP1[str];
            MP1[str] = find(MP1[str]);
            MP2[str] *= MP2[origin];
        }
        return MP1[str];
    }
  1. 判断两个节点是否在一个集合里,通过两个节点的根节点判断
  • code
class Solution {
public:

    map<string, string> MP1;//记录节点的父亲根节点
    map<string, double> MP2;//记录节点的父节点到父亲节点的权重
    vector<double> res;
    vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {

        //初始化map,自己是自己的根节点
        for (auto equation : equations)
        {
            for (auto str : equation)
            {
                MP1[str] = str;
                MP2[str] = 1.0;
            }
        }

        //合并根节点
        for (int i = 0; i < equations.size(); i++)
        {
            Union(equations[i][0],equations[i][1], values[i]);
        }

        
        for (int i = 0; i < queries.size(); i++)
        {
            string str1 = queries[i][0];
            string str2 = queries[i][1];
            if (is_set(str1, str2))
                res.push_back(MP2[str1] / MP2[str2]);
            else
                res.push_back(-1.0);
        }
        return res;
    }

    //合并
    void Union(string str1,string str2,double w)
    {
        string son = find(str1);
        string father = find(str2);
        if (father == son)
            return;
        MP1[son] = father;
        MP2[son] = w * MP2[str2] / MP2[str1];
    }

    //寻找父亲根节点
    string find(string str)
    {
        if (MP1[str] != str)
        {
            string origin = MP1[str];
            MP1[str] = find(MP1[str]);
            MP2[str] *= MP2[origin];
        }
        return MP1[str];
    }

    //判断是否在一个集合
    bool is_set(string str1, string str2)
    {
        if (MP1.find(str1) == MP1.end() || MP1.find(str2) == MP1.end())
        {
            return false;
        }
        if (find(str1) == find(str2))
            return true;
        return false;
    }
};

注意事项

我在写这道题的时候在这个地方犯了错
在这里插入图片描述

来控制42步进电机。这个项目对于初学者来说是一个很好的实践机会,因为它涉及到基础的硬件连接、编程以及理解步进电机的工作原理。我们要了解51单片机。51系列是基于Intel 8051微控制器的单片机,广泛应用于各种电子设备中。它具有内置的CPU、RAM、ROM、定时器/计数器等基本功能,适用于简单的控制任务。A4988是Pololu公司生产的一款步进电机驱动芯片,它支持全步、半步和细分驱动模式,可以提供高达35V、1.5A的驱动电流。A4988内置了过流保护,使得它在驱动步进电机时更加安全可靠。在本项目中,A4988将作为51单片机与42步进电机之间的接口,接收单片机的指令并驱动电机运行。42步进电机通常指的是电机的外径为42mm,它是一种多极永磁同步电机,常见的有四相六线或四相八线接法。6线电机可以通过不同的接线方式实现不同的步距角,如半步或全步。接下来,我们来看看如何编程51单片机来控制A4988。51单片机的编程通常使用汇编语言或C语言,代码中的注释将帮助我们理解每个指令的作用。例如,我们需要设置使能(Enable)信号、方向(Direction)信号和脉冲(Step)信号,这些信号的高低电平变化会告诉A4988何时改变电机的位置。通过调整脉冲频率和脉冲序列,我们可以控制电机的速度和转动方向。在A4988的使用中,我们还可以通过设置微步分辨率来提高步进电机的精度。微步驱动模式将每个完整的步进分解为更小的步进,这样可以减小电机运行时的振动和噪音,并提高定位精度。在实际操作中,你需要将51单片机的GPIO引脚连接到A4988的相应控制端口,例如EN(使能)、DIR(方向)和STEP(脉冲)。同时,确保电机电源和A4988的电源连接正确,以提供足够的电流驱动电机。压缩包中的“51_a4988_1”可能是包含源代码、电路图和其他相关资料的文件。下载后,你可以查看代码了解具体实现细节,也可以参考电路图进行硬件搭建。通过实践这个项目,你不仅可以掌握51单片机的基本编程,还能了解到步进电机和驱动器的使用,对电子控制技术有更深入的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【星光技术人】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值