大连理工大学OOP大作业开关盒布线问题.docx

大连理工大学OOP大作业开关盒布线问题.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
大连理工大学OOP大作业开关盒布线问题

面向对象程序设计大作业开关盒布线问电信1211张博问题分析开关盒布线问题可以分为两个步骤:分析布线的可行性以及布线的具体实现。对于布线的可行性分析,仔细观察布线盒可以发现,可行的布线方案均具有栈的结构。即:从第一个针脚开始检查,若栈空或当前针脚与栈顶元素不属于同一个网组,则将其入栈;若当前针脚与栈顶元素属于相同网组,则将栈顶元素弹出。当所有针脚检查完成后,若栈中没有任何元素,则该布线方案可行,否则该布线方案不可行。例如,对于题目所给布线盒,有如下布线方案:可行布线方案:(1,4)(2,3)(5,6)(7,8)1入栈→2不与栈顶元素1一个网组,2入栈→3与2一个网组,2出栈→4与栈顶元素1一个网组,1出栈→栈空→5入栈→6与栈顶元素5同一个网组,5出栈→栈空→7入栈→8与栈顶元素7同一个网组,7出栈→栈空→针脚检查完成,此时栈空,因此此方案可行。不可行布线方案:(1,3)(2,4)(5,6)(7,8)1入栈→2不与栈顶元素1一个网组,2入栈→3不与栈顶元素2一个网组,3入栈→4不与栈顶元素3一个网组,4入栈→5不与栈顶元素4一个网组,5入栈→6与栈顶元素5一个网组,5出栈→7不与栈顶元素4一个网组,7入栈→8与栈顶元素7一个网组,7出栈→针脚检查完成,此时栈不空,因此该方案不可行。而布线的具体实现,本质上是在布线区域内选择若干个拐点,使得通过这些拐点的连线能从一个网组的一个针脚到达另外一个针脚而不与现有的任何一条布线相交。在此过程中,最重要的问题就是如何选择拐点。为解决这个问题,本文设计了一种递归算法以完成布线拐点的搜索实现。为尽可能简单的实现在MFC中对数据库的IO操作,本文使用了轻量级的开源数据库SQLite,同时设计实现了一个简单的接口类DBIO,将本设计需要用到的所有接口函数封装到该类中,尽可能的简化了数据库的IO操作,为上层程序提供支持。算法选择在分析布线的可行性阶段,首先要检查输入针脚和网组的合法性,即:针脚总数必须为偶数,网组编号必须包括1到N(N是针脚总数)的每一个整数。为此,本文使用了C++标准模板库中的sort函数,这是一种基于快速排序、堆排序和归并排序等算法的综合算法,同时在效率上做了优化,能够满足设计需要。在检查合法性之后需要判断布线是否可行,由上文的问题分析可知,需要有一种堆栈结构完成这项工作。为此,本文同样使用了STL的stack适配器,结合上文提到的检测算法,用于检测布线可行性。在布线的具体实现阶段,本设计实现了一个递归算法,即:首先从起始点开始,按照一定方向搜索到达结束点的路径,如果尝试的搜索路径不与任何一条已知布线相交,则将该搜索路径连线并加入已知布线的集合(此时连线的终点即布线的拐点),然后递归搜索拐点到达结束点的路径,直至达到结束点为止;如果搜索路径与已知布线相交,则尝试搜索另外的搜索路径。在实际调试中,为解决一些bug,另外增加了一个算法,在网组确定之后,将网组按照间距从大到小进行排序,即先布置相距较远的网组连线,然后布置相距较近的网组连线。该算法无法在STL中找到对应的原型,故对其进行了基于快速排序的实现。在数据库接口的实现方面,由于需要存放不确定数量的网组分布,而关系型数据库要求数据表的列数恒定,针对这个矛盾,本设计将网组分布的int数据用特殊字符分割后转换为变长字符串存入数据库。网组分布的拆分和组装工作由数据库接口类负责实现,写入数据库时,上层只需要传递int数组的指针和数组大小即可,而从数据库中读出数据时,上层可以直接获得int数组的指针。为了统计算法耗时,最初使用的是MFC的API,使用过程中发现它的精度虽然已经达到了1ms,但是还是不能满足设计要求。事实上,布线算法计算的耗时远小于1ms。为此,使用了底层的Windows API函数QueryPerformanceFrequency和QueryPerformanceCounter用于从硬件直接获取高精度时间。方案设计作为对底层数据库的支持,本设计首先实现了数据库的接口类DBIO。SQLite是一个轻量级的关系型数据库管理系统,全部代码只有约5MB,特别适合小型程序对数据库管理的需求。数据存放于data.db中的switchbox表,该表由五列组成:边1的针脚数量(int)、边2的针脚数量(int)、边3的针脚数量(int)、边4的针脚分布(int)、网组分布(varchar)。此接口类封装了读取和写入数据库的接口函数。写入数据库时,上层只需要提供存放针脚数量的int[4]指针和存放网组分布的int数组指针,由接口类负责将网组分布的int数组元素用‘#’字符分割后转换为字符串,然后将四个边的针脚数量分别读出,最后把所有的数据写成一条SQL语句,完成对数据库的写入。读取数据库时,DBIO类通过一条SQL语句将数据

您可能关注的文档

文档评论(0)

docman126 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档