23
2021
06

设置导线任意位置断路功能实现

问题描述

在初中家庭电路的学习中,故障诊断是一个难点,其中,有这样一个场景,导线某个位置断了,要让学生判断故障原因,并找出断路的位置。

电路的计算中,我们把导线抽象成了一个边,只能整体设置是否断路,不支持设置断路的位置。在家庭电路中,我们把火线、地线、零线看做接线柱,因为火线、地线、零线要连接导线,只有接线柱可以连接导线。接线柱不可能设置断路。



方法1

由于火线、地线、零线功能是一样的,所以我们只考虑火线。

设置断路的小红点,我们成为“断路工具”。

为了方便,我们将导线上的坐标归一化一下,左端为0,右端为1。

  • 在设置断路位置的时候,我们记录下断路位置的坐标。

  • 同理,在连接导线的时候,我们记录下导线接线柱的位置。

  • 将连接到火线上的接线柱或断路工具按坐标从小到大的顺序进行排序。

  • 设一个变量isBreak,默认为false,遍历火线上连接的元件,如果是导线接线柱,将导线是否断路设为isBreak的值如果是断路工具,将isBreak设为true。

分析

我们把火线上的断路,转化成了连接的导线的断路。

优点: 实现简单,不用改变原来的模型。

缺点: 有BUG。很容易找到一个反例。比如下面这种连接方式。

我们用一个开关连接了断路的两端,当我们打开开关时,第一个断路应该不起作用,但是按照当前的方法,后面连接的器材还是断路状态。

方法2

想偷点懒还是不行,还是要老老实实按实际情况来。

分析

最初状态,火线相当于一条边。

设置一处断路,1条边会变成3条边。

连接一个导线,1条边会变成2条边。

在连接,断开的时候,要不断的动态创建销毁边。用户可以任意连接,最终会是一个复杂的网状结构。

如果我们只考虑设置断路,不考虑连接导线,就是一个链状结构了。实现起来就要简单很多。

对于导线,我们可以结合方法1,动态的设置导线的连接位置(导线的连接不增加边的个数)。如下图。火线被连接的导线分成了两部分,但是由于被分割的两部分都是通路,所以和将导线直接连接到火线的右侧(左侧也一样)是等效的。(我们忽略火线的电阻影响)

解决

我们使用双向链表来实现断路设置功能(数据结构太有用了)。实现细节就不再赘述了。

导线连接到火线时,根据坐标计算出导线应该连接的接线柱。

断路位置改变时,刷新火线上连接的导线的连接位置。

效果

总结

初看挺复杂,认真分析一下,实现起来也不是很困难。

最终使用的还是很熟悉的数据结构-双向链表。

结合我们学过的物理知识,我们将问题做了一些简化,在很大程度上降低了问题的复杂度。


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。