堆栈应用(4):开关盒布线

1、问题描述

开关盒布线问题是这样的:给定一个矩形布线区域,其外围有若干针脚。两个针脚之间通过布设一条金属线路而实现互连。这条线路被称为电线,被限制在矩形区域内。如果两条电线发生交叉,则会发生电流短路。所以,不允许电线间的交叉。每对互连的针脚被称为网组。我们的目标是要确定对于给定的网组,能否合理地布设电线以使其不发生交叉。图 5-7a 给出了一个布线的例子,其中有八个针脚和四个网组。四个网组分别是 ( 1 , 4 , ), ( 2 , 3 ), ( 5 , 6 )和( 7 , 8 )。图5 -7b 给出的布线方案有交叉现象发生( (1,4) 和(2,3) 之间),而图 5-7c 则没有交叉现象发生。由于四个网组可以通过合理安排而不发生交叉, 因此可称其为可布线开关盒( routable switch box)。我们要解决的问题是,给定一个开关盒布线实例,确定它是不是一个可布线的。

2、解决思路

  为了解决开关盒布线问题,我们注意到,当两个针脚互连时,其电线把布线区分成两个分区。例如,当 ( 1 , 4 )互连时,就得到了两个分区,一个分区包含针脚 2和3,另一个分区包含针脚5 ~ 8。现在如果有一个网组,其两个针脚分别位于这两个不同的分区,那么这个网组是不可以布线的,因而整个电路也是不可布线的。如果没有这样的网组,则可以继续判断每个独立的分区是不是可布线的。为此,可以从一个分区中取出一个网组,利用该网组把这个分区又分成两个子分区,如果任一个网组的两个针脚都分布在同一个子分区之中(即不会出现两个针脚分别位于两个子分区的情形),那么这个分区就是可布线的。
为了实现上述策略,可以按顺时针或反时针方向沿着开关盒的外围进行遍历,可从任意一个针脚开始。例如,如果按顺时针方向从针脚 1 开始遍历图 5-7a 中的针脚,那么将依次检查针脚1, 2, ..., 8。针脚1 和4属于同一个网组,那么在针脚 1至针脚4之间出现的所有针脚构成了第一个分区,而在针脚 4至针脚 1 之间出现的所有针脚构成了第二个分区。把针脚 1 放入堆栈,然后继续处理,直至遇到针脚 4。这个过程使我们仅在处理完一个分区之后才能进入下一个分区。下一个针脚是针脚 2,它与针脚 3同属一个网组,它们又把当前分区分成两个子分区。与前面的做法一样,把针脚2放入堆栈,然后继续处理直至遇到针脚3。由于针脚3与针脚2属同一个网组,而针脚2正处在栈顶,这表明已经处理完一个子分区,因此可将针脚 2从栈顶删除。接下来将到针脚4,由于与之互连的针脚 1正处在栈顶,因此当前的分区已经处理完毕,可从栈顶删除针脚1 。按照这种方法继续进行下去,直至检查完八个针脚,堆栈变空,所创建的分区都已处理完毕为止。

  而对于不可布线的开关盒,最后堆栈不会为空。

3、代码实现

堆栈的实现见:堆栈的链表方式实现

 1 #include "Checkbox.h"
 2 //net存储开关盒针脚的分组编号,n为针脚个数
 3 bool CheckBox(int net[],int n)
 4 {
 5     LinkedStack<int> S;
 6     if (n<=0)
 7     {
 8         throw OutofBounds();
 9     }
10
11     for (int i = 0; i < n;++i)
12     {
13         if (S.IsEmpty())
14         {
15             S.Add(net[i]);//堆栈为空,直接添加
16             continue;
17         }
18
19         if (S.Top()==net[i])//等于栈顶,说明可以直接走线
20         {
21             int temp;
22             S.Delete(temp);
23         }
24         else
25         {
26             S.Add(net[i]);
27         }
28     }
29
30     return S.IsEmpty();//堆栈空说明无交叉可布线
31 }
 1 #include "Checkbox.h"
 2 #include <istream>
 3
 4 int main()
 5 {
 6     int net[] = { 1, 2, 3, 2, 1, 3, 4, 4 };
 7
 8     if (CheckBox(net, 8))
 9     {
10         std::cout << "可布线开关盒" << std::endl;
11     }
12     else
13     {
14         std::cout << "不可布线开关盒" << std::endl;
15     }
16
17     system("pause");
18
19     return 0;
20 }

输出:

时间: 2024-10-17 17:09:20

堆栈应用(4):开关盒布线的相关文章

开关盒觉得废话好多人

 http://imgur.com/lTJgkrV20150315 http://imgur.com/4Y2aKlp20150315 http://imgur.com/Vtjp3R620150315 http://imgur.com/5jSVJ4Z20150315 http://imgur.com/qRdTtwH20150315 http://imgur.com/6nFGqZo20150315 http://imgur.com/gTU6Aq720150315 http://imgur.com

设计模式 之 桥接

桥接模式(Bridge Pattern) 也称为桥梁模式.将抽象部分与它的实现部分分离,使它们都可以独立地变化. 居家生活,大家都用过电灯,开关和电灯通过电线相连接,开关控制电灯的亮与灭.当今各种物质产品令郎满目,五花八门,开关和电灯也是多种多样,例如:开关的种类有按钮式开关,声控式开关.触摸式开关.旋转式开关等.电灯的种类更是层出不穷,如白炽灯.霓虹灯.水晶灯等. 这么多开关和电灯,如果现在在家里想换一盏水晶灯,难道要把墙抛开重新设计线路,才能装上水晶灯吗?当然不是的.开关连通电源,电线传输电

自己动手打造属于自己的智能家居(二)

上篇讲完了手机如何连接智能主机,这篇开始讲解智能主机如何去控制家中各个设备.这篇会写的比较详细,涉及到的基本知识也会讲解,意在让大家明白里面的原理. 下面我们把家里的设备分一下类:(这里写的一些典型的设备,等明白原理后对于其他的设备,也可以自己去添加了) 第一类:电视.空调 第二类:家里的各种灯 第三类:热水器.电饭煲 第四类:台灯 第五类:窗帘 ================================详细讲解分割线============================== 一.第一类

智能家居DIY

最近智能家居比较火,将房子简单改造下,也算体验智能家居. 本文讲解的是用无线的方式,优点是:不用改造现有线路,直接安装模块即可实现想要的功能,花的钱也较少,共六百左右 =======================正文开始分割线======================== 一.最终要实现的效果: 用智能手机可以控制家中的电视.空调.灯光.窗帘.热水器.电饭煲 实现上述功能,大概费用几百块钱左右 二.具体的实现过程 整体流程:A------>B------>C 1.这里A表示手机,需要是智能

AUTOTRONICS C-28-29A

3C 凸轮开关 SALZER P110-61049-219M1 P110-61049-219M1 马达离合器 AUTOTRONICS C-28-29A气弹簧 STABILUS 082546 300NETA ESX10-TD-101-DC24V-2/4/6A火焰淬火控制执行器 FTSI AHP052DA VESTA PVA326M8casappa PLP10.6,3 D0-30K2-LBB/BA-N-EL FS MICROPRECISION SA CH-1895 VOUVRY MADE IN SW

去除警告,打电话,发信息,应用程序之间跳转,打印沙盒路径,字符串名字转换方法,包装导航控制器等的代码

从偏好设置中读取值: 打电话代码: 发信息代码: 打印沙盒路径代码: 应用程序之间跳转代码: 跳转到苹果商店代码: 去除警告代码: 根据字符串名称转换成相对应方法的代码: #import "SZMSettingsCell.h" @implementation SZMSettingsCell //选择不同的cell类型 + (UITableViewCellStyle)cellStyleWithDict:(NSDictionary *)dict{ UITableViewCellStyle

弹性盒模型

Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性 Flexbox布局的主体思想是似的元素可以改变大小以适应可用空间,当可用空间变大,Flex元素将伸展大小以填充可用空间,当Flex元素超出可用空间时将自动缩小.Flex元素是可以让你的布局根据浏览器的大小变化进行自动伸缩. 创建Flex容器 flexbox布局首先需要创建一个flex容器.为此给元素设置display属性的值为flex.对于IE10来说,需要在开头的地方添加-ms-flexbox. .container{

[转]PCB布线设计

原文链接:http://download.eeworld.com.cn/detail/%E5%B8%B8%E8%A7%81%E6%B3%BD1/8623 一.PCB布线设计1 在当今激烈竞争的电池供电市场中,由于成本指标限制,设计人员常常使用双面板.尽管多层板(4层.6层及8层)方案在尺寸.噪声和性能方面具有明显优势,成本压力却促使工程师们重新考虑其布线策略,采用双面板.在本文中,我们将讨论自动布线功能的正确使用和错误使用,有无地平面时电流回路的设计策略,以及对双面板元件布局的建议. 1.1 自

构建移动Web应用程序的技术堆栈

编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重要的框架类型,其中每一个可以展开来写一篇文章.这并不是一个广泛的现有产品相比,只是一个笔者最近使用的部分技术. 虽然笔者的重点是移动优先, 笔者认为,这套技术可以应用在一般的web应用程序. 笔者的决定和数据支持考虑了几个要求: 基于JavaScript(CoffeeScript,Dart,绝对值得