《数据结构、算法与应用C++语言描述》-栈的应用-开关盒布线问题

news2024/11/25 13:12:51

开关盒布线问题

问题描述

在开关盒布线问题中,给定一个矩形布线区域,其外围有若干管脚。两个管脚之间通过布设一条金属线路来连接。这条金属线路称为电线,它被限制在矩形区域内。两条电线交叉会发生电流短路。因此,电线不许交叉。每对要连接的管脚称为一个网组。对于给定的一些网组,我们需要确定,它们能否连接而又不发生交叉。图 8-8a是一个布线的示例,其中有8个管脚和4个网组。四个网组分别是(1,4),(2,3),(5,6)和(7,8)。图8-8b的布线在网组(1,4)和(2,3)之间有交叉,而图 8-8c的布线没有交叉。因为这 4 个网组的布线可以没有交叉,所以这个开关盒称为可布线开关盒(routable switch box)。(在现实问题中,两个相邻的电线之间还要求保留一个最小的间隙,但是我们忽略这个额外的要求。)我们的问题是,输入一个开关盒布线实例,然后确定它是否可以布线。图8-8b和图8-8c的电线都是与x轴和y轴平行的直线段,但与轴不平行的直线段或曲线段也是可以的。

在这里插入图片描述

求解策略

为了解决开关盒布线问题,我们注意到,当一个网组互连时,连线把布线区域分隔成两个分区。分区边界上的管脚属于哪一个分区与连线无关,而与互连网组的管脚有关。例如,当网组(1,4)互连时,就有两个分区。一个分区包含管脚 2 和 3,另一个分区包含管脚5 ~8。**现在如果有一个网组,其两个管脚分别属于两个不同的分区,那么这个网组是不可布线的,进而整个开关盒布线实例也是不可布线的。**如果没有出现这样的网组,那么我们就可以根据连线不能跨区的原则,对每个分区是否可独立布线的问题做出判断。如果从一个分区中选择一个网组,这个网组把其所属分区分成两个子分区,而其余任一个网组的两个管脚都分属不同的子分区,那么就可以判断,这个分区是可布线的。

为了实现这个策略,可以从任意一个管脚开始,按顺时针或逆时针方向沿着开关盒的边界进行遍历。如果从管脚1 开始沿顺时针方向遍历图 8-8a 的管脚,那么遍历的管脚顺序是1,2,…,8。管脚1和4是一个网组,于是管脚1至4之间出现的所有管脚构成第一个分区,管脚4至1之间出现的所有管脚构成另一个分区。把管脚1插入栈,然后继续处理,直到管脚4。这个过程使我们仅在处理完一个分区之后才能进入下一个分区。下一个是管脚2,它与管脚 3 是一个网组,它们把当前分区分成两个分区。与前面的做法一样,把管脚 2 插入栈,然后继续处理,直到管脚3。由于管脚3和管脚2是一个网组,而管脚2正处在栈顶,因此这表明已经处理完一个分区,可将管脚 2 从栈顶删除。接下来将遇到管脚 4,而与它同是一个网组的管脚 1 正处在栈顶。现在,对一个分区的处理已经完毕,可从栈顶删除管脚 1。按照这种方法继续下去,我们可以完成对所有分区的处理,而且当 8个管脚都检查之后,栈为空。

代码

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

/*开关盒布线问题*/
/*确定开关盒是否可布线;数组net[0,n-1]管脚数组,用以形成网组;n是管脚个数*/
bool checkBox(int net[], int n)
{
    stack<int>* s = new stack<int>();
    //按顺时针扫描网组
    for (int i = 0; i < n; i++)
    {
        //处理管脚i
        if (!s->empty())
        {
            //检查栈的顶部管脚
            if (net[i] == net[s->top()])
                //管脚net[i]是可布线的,从栈中删除
                s->pop();
            else s->push(i);
        }
        else s->push(i);
    }
    //检查是否有剩余的不可布线的管脚
    if (s->empty())
    {
        //没有剩余的管脚
        cout << "Switch box is routable." << endl;
        return true;
    }
    else
    {
        //有剩余的管脚
        while(!s->empty()){
            cout << s->top() << " ";
            s->pop();
        }
        cout << endl << "Switch box is not routable." << endl;
        return false;
    }
}

int main()
{
    cout << "checkBox()**********************" << endl;
    int net[8] = { 1,2,2,1,3,3,4,4 };
    cout << "checkBox(net, 8) = " << endl;
    checkBox(net, 8);
    return 0;
}

运行结果

checkBox()**********************
checkBox(net, 8) =
Switch box is routable.

Process finished with exit code 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建

ESP-Mesh-Lite的开发环境由于没有官方教程&#xff0c;折腾了好几天。环境搭建主要还是参考ESP-MDF环境搭建&#xff0c;特别注意的是必须要在CMD环境下操作&#xff0c;不能用POWER SHELL。 ESP-Mesh-Lite目前支持到5.1的SDK&#xff0c;当然4.4也是可以用的。首先上Gitee或G…

AI绘画本地部署Stable Diffusion web UI

AI绘画本地部署Stable Diffusion web UI 一 、项目介绍 A browser interface based on Gradio library for Stable Diffusion. 项目地址&#xff1a;GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 这是一个可以通过直接输入描述性文字文本来生成…

keil调试的时候没问题,下载时候没反应

今天遇到这样一个问题。我下载商家的代码例程后单片机没反应&#xff0c;进入调试的时候一切正常。很奇怪&#xff0c;在网上找了教程问题解决&#xff0c;总结一下。 原因在于程序下载进去后没有按下复位键&#xff0c;导致还是之前的程序。我之前设置的是下载后自动复位运行…

滴答定时器

1.定时与计数的本质 2.滴答定时器的原理 1.向下计数&#xff0c;24位的计数器。滴答定时器属于内核。 每来一个脉冲计数值减一。当为零时。继续把重载寄存器给计数值。然后每来一个脉冲减一。 可以不停重复次操作。 控制寄存器&#xff1a;时钟的选择(bit2&#xff09;&…

【C语言】通讯录系统实现 (保姆级教程,附源码)

目录 1、通讯录系统介绍 2、代码分装 3、代码实现步骤 3.1、制作菜单menu函数以及游戏运行逻辑流程 3.2、封装人的信息PeoInfo以及通讯录Contact结构体类型 3.3、初始化通讯录InitContact函数 3.4、增加联系人AddContact函数 3.5、显示所有联系人ShowContact函数 3.6、…

对比两个数组中 每个对应位置的元素大小 返回每个对比结果组成的列表 numpy.fmin()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 对比两个数组中 每个对应位置的元素大小 返回每个对比结果组成的列表 numpy.fmin() [太阳]选择题 请问代码中最后输出正确的是&#xff1f; import numpy as np a np.array([1, 3, 6, 8]) …

面试必考精华版Leetcode1372. 二叉树中的最长交错路径

题目&#xff1a; 代码&#xff08;首刷看解析)&#xff1a; class Solution { public:int maxAns;//dir 0 left,1 rightvoid dfs(TreeNode* root,bool dir,int len){maxAnsmax(maxAns,len);if(!dir){if(root->left) dfs(root->left,1,len1);if(root->right) dfs(roo…

给奶牛做直播之四

一、前言 给奶牛做直播之三 我们讲了怎么搭建RTMP直播服务器&#xff0c;前几天在折腾Android直播推拉流一直没个结果&#xff0c;顺手整理了一下Android如何加载SO动态库&#xff0c;本想顺着这条路把JNI、NDK、JSBridge、Python调用SO这些一起整理出来 &#xff0c;这样搞就…

叶工好容6-自定义与扩展

本篇主要介绍扩展的本质以及CRD与Operator之间的区别&#xff0c;帮助大家理解相关的概念以及知道要进行扩展需要做哪些工作。 CRD&#xff08;CustomerResourceDefinition&#xff09; 自定义资源定义,代表某种自定义的配置或者独立运行的服务。 用户只定义了CRD没有任何意…

28296-2012 含镍生铁 思维导图

声明 本文是学习GB-T 28296-2012 含镍生铁. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了含镍生铁的技术要求、试验方法、检验规则以及包装、储运、标志和质量证明书。 本标准适用于炼钢、铸造或合金材料中作为镍元素添加剂的…

C++实现集群聊天服务器

C实现集群聊天服务器 JSON Json是一种轻量级的数据交换模式&#xff08;也叫做数据序列化方式&#xff09;。Json采用完全独立于编程语言的文本格式来存储和表示数据。见解和清晰的层次结构使得Json称为理想的数据交换语言。易于阅读和编写。同时也易于支持机器解析和生成&am…

28384-2012 平台式平型网版印刷机 阅读笔记

声明 本文是学习GB-T 28384-2012 平台式平型网版印刷机. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了平台式平型网版印刷机的术语和定义、型式与基本参数、要求、试验方法、检验规则、 标志、包装、运输与贮存。 本标准适用…

babel.config.js配置文件详解

文章目录 一、前言三、babel 详解四、拓展阅读 一、前言 项目开发阶段&#xff0c;使用可选链操作符 ?. 出现以下编译报错问题&#xff1a; 分析&#xff1a;由于可选链操作符 ?. 是ES2020&#xff08;即ES11&#xff09;中推出的新语法&#xff0c;允许我们不需要校验当前属…

【软考】系统集成项目管理工程师(五)项目立项管理【5分】

一、 项目建议书 1、定义 项目建议书又称为立项申请&#xff1b;建设单位向上级主管部门提交项目申请时所必须的文件&#xff0c;是对拟建项目提出的框架性的总体设想&#xff1b;是项目发展周期的初始阶段&#xff0c;是国家或上级主管部门选择项目的依据&#xff0c;也是可行…

取消excel表格中的隐藏行

Excel工作表中的行列隐藏了数据&#xff0c;如何取消隐藏行列呢&#xff1f;今天分享几个方法给大家 方法一&#xff1a; 选中隐藏的区域&#xff0c;点击右键&#xff0c;选择【取消隐藏】就可以了 方法二&#xff1a; 如果工作表中有多个地方有隐藏的话&#xff0c;还是建…

【python基础】复杂数据类型-列表类型(元组)

1.初识元组 列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的。 然而,有时候需要创建一系列不可修改的元素,元组可以满足这种需求 python将不能修改的值称为不可变的,而不可变的列表被称为元组。 元组看起来犹如列表,但使用圆括号而不是方括号来标识…

苹果文件传到mac电脑用什么软件?

在数字化时代&#xff0c;文件传输已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;苹果用户在将手机文件传输到电脑时&#xff0c;往往会面临一些困扰。曾经的“文件传输助手”并不能完全满足用户的需求。于是&#xff0c;很多人开始寻找更便捷的解决方案。在本文中…

Nginx 代理WebSocket

## √ map $http_upgrade $connection_upgrade {default upgrade; close; }## √ upstream websocket {server 127.0.0.1:9999 weight10 max_fails2 fail_timeout30s; }server {listen 8020;gzip on;gzip_min_length 1k;gzip_comp_level 9;gzip_types text/plain application/…

集合-set系列集合

系列文章目录 1.集合-Collection-CSDN博客​​​​​​ 2.集合-List集合-CSDN博客 3.集合-ArrayList源码分析(面试)_喜欢吃animal milk的博客-CSDN博客 4.数据结构-哈希表_喜欢吃animal milk的博客-CSDN博客 5.集合-set系列集合-CSDN博客 文章目录 目录 系列文章目录 文章目录…

JS defineProperty详解

defineProperty Object.defineProperty():方法会在对象上直接定义个新的属性&#xff0c;或者修改现有的属性&#xff0c;并返回此对象 let obj {} //与我们使用 obj.name zhangsna 效果一样 但是用defineProperty定义的属性无法改变 或者删除 Object.defineProperty(obj,n…