版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验二 电路布线问题1. 问题定义及需求分析1.1课题目的和任务问题描述:印刷电路板将布线区域划分为nn个方格阵列。在布线时,电路只能沿直线或直角布线。为避免线路相交,已布线的方格要做封锁标记。设起始位置为a,终止位置为b,求解电路布线问题。实验要求:设计印刷电路板的布线模拟程序。1)采用栈或队列等数据结构。2)采用穷举法的回溯搜索,求a到b可能的布线线路。3)推荐采用层次优先搜索,求a到b最优的布线线路。1.2数据形式输入数据形式:通过生成随机数的函数随机生成一个矩阵。输入值的范围:生成的矩阵中的数值为int型,为0或者1,其中0表示死路,1表示通路。 输出数据形式:输出到显示器。1.3程序
2、功能随机给定一个线路分布矩阵,利用穷举法,通过栈的应用,求出从a到b的可能布线线路;采用层次优先搜索,通过队列的应用,求出a到b的最优布线线路。1.4测试数据测试数据为随机生成的矩阵。2. 概要设计2.1抽象数据类型需要定义一个位置类型的数据,里面包含int型的x和y坐标,用来记录位置信息;再定义一个swire的通道块数据类型,里面包含该通道块的位置数据,在路径上的序号和方向信息;另外还需要构建栈和队列的基本结构类型。2.2主程序流程及各模块之间的调用关系3. 详细设计3.1存储结构实现typedef struct/位置 int x; int y;position;typedef struct
3、/移动标记 int ord; position seat; int di;swire;typedef struct/栈 swire* base; swire* top; int stacksize;stack;typedef struct qnode/队列 position data; struct qnode* next;qnode,*qp;typedef struct qp fron; qp rear;linkq;3.2负责模块的伪码算法(1)int wirepath(int* board,position start,position finish)/寻找路径算法/若有从电路板的入口st
4、art到出口end的通道,则求得一条存放在栈中/(从栈底到栈顶) initstack(s); curpos=start;/设定当前位置为入口位置 curstep=1;/探索第一步 do if(pass(s,curpos)/当前位置可通过,即是未曾走到的通道块 footprint(curpos);/留下足迹 e=(curstep,curpos,1); push(s,e);/加入路径 if(curpos=finish)/到达出口(终点) printstack(s);/输出路径 printf(电路板的搜寻图) return 1;/返回 nextpos(curpos,1);/下一位置是当前位置的东邻
5、curstep+;/探索下一步 else/当前位置不能通过 pop(s,e); if(s.top!=s.base)/栈空 while(e.di=5&s.top!=s.base) markprint(e.seat); pop(s,e);/留下不能通过的标记,并退回一步 if(e.di5) e.di+; push(s,e); /换下一个方向探索 nextpos(e.seat,e.di);/设定当前位置是该新方向/上的相邻块 curpos.x=e.seat.x; curpos.y=e.seat.y; while(s.base!=s.top);printf(没有通路);printf(电路板的搜寻图);
6、 return 0;(2)int findshortway(int* board,position start,position finish)/搜寻最短布线路径算法 if(finish=start)/到达终点,结束 mshortpath=0; return 1; curpos=start;/标记当前位置 if(boardstart.xstart.y=0)没有通路!return 0; boardstart.xstart.y=2;/有通路,则令其值为2while(1)/将第一个通道块赋值2,并将其相邻通道块从右开始,按顺时/针依次入队列,当队列不空时,出队列一个通道块,对其相邻通道块做相/同操作
7、,直至所有的未标记通路通道块都被标记后为止。 for(i=1;i=0;j-)/反向搜索最短路径 pathj=curpos; for(i=0;i5;i+)/在相邻通道块中找符合的标记值 neighbour=curpos; nextpos(neighbour,i); if(boardneighbour.xneighbour.y=j+2)break; curpos=neighbor;/当前位置为相邻通道块 printf(输出最短布线路径); printf(输出最短路径搜寻矩阵); return 1;4. 调试分析4.1问题分析与解决方法(1)寻找可能路径若当前位置可通过,则纳入当前路径,并继续朝着下
8、一位置探索,即切换下一位置为当前位置,如此重复直至到达出口;若当前位置不可通,则应顺着来向退回到前一通道块,然后朝着除来向之外的其他方向继续探索;若该通道块的四周4个方块均不可通,则应从当前路径上删除该通道块。所谓下一位置指的是当前位置四周4个方向(东南西北)上相邻的方块。假设以栈s记录当前路径,则栈顶中存放的是当前路径上的最后一个通道块。由此,纳入路径的操作即为当前位置入栈;从当前路径上删除前一通道块的操作即为出栈。通过入栈和出栈操作,使得当前位置找寻到出口位置,从而实现对迷宫一个可能路径的求解。(2)寻找最优路径 标记当前位置,通过队列,将当前位置周围的四个通道块入队列,将当前位置标记值m
9、后,出队列,对该通道块执行相同的操作,并标记值m+,通过循环操作,直到当前位置为出口时终止。借助队列,通过循环操作,使每个通道块都被赋值。然后标记当前位置为出口,从出口向入口寻找符合递减值的通道块,从而确定出最短路径。4.2算法的时空分析(1)寻找可能路径时间复杂度:空间复杂度:(2)寻找最优路径时间复杂度:空间复杂度:4.3算法的改进设想通过对搜寻可能路径的算法改进,实现能够同时输出多条可能路径的功能。而最优路径也有可能有多条,因此可以改进搜索最优路径的算法,使其能够输出全部的最优路径。可以考虑加入多重标记的方法实现。4.4经验和体会 电路板布线问题实际上就是迷宫求解问题,电路板上的布线要求
10、可以转化成迷宫的通路和不通路的问题,当电线可以经过该点时,该点即为通路,而当电线不能经过该点时,它即为死路,利用1,0分别表示通路和死路,就可以建立类似迷宫求解的模型,通过栈和队列的一系列数据结构的辅助,来求解迷宫问题。5. 使用说明运行程序,系统会自动给出一个随机电路板矩阵,自动输出一个可能的布线路径和最优布线路径,并给出搜寻路径的标记图;若该电路板不存在可行路径,则会提示没有通路。6. 测试结果(截屏)(1)随机生成的电路板矩阵:(2)可能布线路径:(3)最短布线路径:7. 附录7.1个人负责模块的程序代码int wirepath(int* board,position start,pos
11、ition finish)/寻找路径算法 int i,j; stack s; swire e; position curpos; int curstep; initstack(s);/设定当前位置为入口位置 curpos.x=start.x; curpos.y=start.y; curstep=1;/探索第一步 do if(pass(s,curpos)/当前位置可通过,即未走过 footprint(curpos);/留下足迹 e.ord=curstep; e.seat.x=curpos.x; e.seat.y=curpos.y; e.di=1; push(s,e);/加入路径 if(curpo
12、s.x=finish.x&curpos.y=finish.y)/到达终点 printstack(s); printf(n搜寻路径图(-3表示布线,-1表示死路):n); for(i=0;in;i+) for(j=0;jn;j+) printf(%dt,boardij); printf(n); return 1; nextpos(curpos,1);/下一个位置是当前位置的东邻 curstep+;/探索下一步 else/当前位置不能通过 pop(s,e); if(s.top!=s.base) while(e.di=5&s.top!=s.base) markprint(e.seat);/留下不能通
13、过标记 pop(s,e);/退一步 if(e.di5) e.di+; push(s,e);/换下一个方向探索 nextpos(e.seat,e.di);/设定当前位置是该新方向上的相邻块 curpos.x=e.seat.x; curpos.y=e.seat.y; while(s.base!=s.top); printf(没有通路!nn搜寻路径图(-3表示布线,-1表示死路):n); for(i=0;in;i+) for(j=0;jn;j+) printf(%dt,boardij); printf(n); return 0;int findshortway(int* board,position
14、 start,position finish)/搜寻最短布线路径算法 if(finish.x=start.x&finish.y=start.y)/起点为终点,结束 mshortpath=0; return 1; linkq q; initq(q); int i; position curpos,neighbour; curpos.x=start.x;curpos.y=start.y;/设定起始位置为当前位置 if(boardstart.xstart.y=0)printf(没有通路!n);return 0; boardstart.xstart.y=2;while(1)/利用队列,将每个通道块都做
15、上标记,起点标记为2,其余按到达步数依次累加 for(i=1;i=0;j-)/反向搜寻符合值 pathj=curpos; for(i=0;i); for(i=0;pathi.x!=0&pathi.y!=0;i+) printf(%d,%d),pathi.x,pathi.y); if(pathi.x!=8|pathi.y!=8)printf(-); printf(n); /输出最短路径搜寻矩阵 printf(n搜寻路径图:n); for(i=0;in;i+) for(j=0;jn;j+) printf(%dt,boardij); printf(n); return 1;7.2程序全部代码#inc
16、lude#includeusing namespace std;#include#include#define size 100#define inch 10typedef struct/位置 int x; int y;position;typedef struct/移动标记 int ord; position seat; int di;swire;typedef struct/栈 swire* base; swire* top; int stacksize;stack;typedef struct qnode/队列 position data; struct qnode* next;qnod
17、e,*qp;typedef struct qp fron; qp rear;linkq;int* board;/电路板int mshortpath;/最短路径const int n=10;/电路板大小int createboard()/创建一个电路板 int i,j; board=(int*)malloc(sizeof(int*)*(n); for(i=0;in;i+) boardi=(int*)malloc(sizeof(int)*(n); i=0; srand(time(null); for(i=0;in;i+) for(j=0;jn;j+) if(i=0|i=n-1|j=0|j=n-1)
18、 boardij=0; else boardij=1; if(rand()%2=0) if(rand()%2=0) boardij=0; printf(随机生成的10x10电路板的分布情况为(1可通,0不可通):n); for(i=0;in;i+) for(j=0;j=s.stacksize) s.base=(swire*)realloc(s.base,(s.stacksize+inch)*sizeof(swire); if(!s.base)return(0); s.top=s.base+s.stacksize; s.stacksize+=inch; *s.top=e; s.top+; ret
19、urn 1;int pop(stack &s,swire &e)/出栈 if(s.base=s.top)return(0); e=*(-s.top); return 1;int nextpos(position& f,int i)/1=east,2=sourth,3=west,4=north/尝试相邻位置 if(i=1)f.y+; if(i=2)f.x+; if(i=3)f.y-; if(i=4)f.x-; return 1;int markprint(position f)/留下不可布线的标志 boardf.xf.y=-1; return 1;int printstack(stack& s)
20、/输出栈内存储的布线路径 do printf(%d,%d),s.base-seat.x,s.base-seat.y); if(s.base-seat.x=8&s.base-seat.y=8) else printf(-); s.base+; while(s.top!=s.base); printf(n); return 1;int wirepath(int* board,position start,position finish)/寻找路径算法 int i,j; stack s; swire e; position curpos; int curstep; initstack(s); cur
21、pos.x=start.x; curpos.y=start.y; curstep=1; do if(pass(s,curpos) footprint(curpos); e.ord=curstep; e.seat.x=curpos.x; e.seat.y=curpos.y; e.di=1; push(s,e); if(curpos.x=finish.x&curpos.y=finish.y) printstack(s); printf(n搜寻路径图(-3表示布线,-1表示死路):n); for(i=0;in;i+) for(j=0;jn;j+) printf(%dt,boardij); print
22、f(n); return 1; nextpos(curpos,1); curstep+; else pop(s,e); if(s.top!=s.base) while(e.di=5&s.top!=s.base) markprint(e.seat); pop(s,e); if(e.di5) e.di+; push(s,e); nextpos(e.seat,e.di); curpos.x=e.seat.x; curpos.y=e.seat.y; while(s.base!=s.top); printf(没有通路!nn搜寻路径图(-3表示布线,-1表示死路):n); for(i=0;in;i+) f
23、or(j=0;jnext=null; return 1;int destroyq(linkq& q)/摧毁队列 while(q.fron) q.rear=q.fron-next; free(q.fron); q.fron=q.rear; return 1;int enq(linkq& q,position e)/入队列 qp p; p=(qp)malloc(sizeof(qnode); if(!p)return 0; p-data=e; p-next=null; q.rear-next=p; q.rear=p; return 1;int deq(linkq& q,position& e)/出队列 if(q.fron=q.rear)return 0; qp p; p=q.fron-next; e=p-data; q.fron-next=p-next; if(q.rear=p)q.rear=q.fron; free(p);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育部溺水责任制度
- 强直性脊柱炎后凸畸形截骨术后个案护理
- 音乐疗法在肿瘤治疗中的应用及效果分析
- 2026年天津国土资源和房屋职业学院单招职业倾向性测试题库带答案详解(预热题)
- 2026年天津艺术职业学院单招职业技能测试题库及答案详解参考
- 2026年威海职业学院单招职业适应性测试题库附参考答案详解(a卷)
- 2026年天津职业大学单招职业倾向性考试题库带答案详解(综合题)
- 2026年安康职业技术学院单招综合素质考试题库附参考答案详解(巩固)
- 2026年安徽审计职业学院单招职业倾向性考试题库带答案详解(培优a卷)
- 资金运作规范化管理承诺书3篇
- 选派援疆医疗卫生人才协议书
- XB/T 405-2016铈铁合金
- GB/T 3733.2-1983卡套式端直通接头体
- GB/T 10609.1-2008技术制图标题栏
- 课件五笔输入法
- 最新景观照明培训专业知识讲座课件
- 基于单片机的交流数字电压检测系统仿真设计-数字显示模块设计毕业设计(论文)说明书
- 钢管工艺焊接方案
- 六年级下册道德与法治课件第一单元第三课
- 人教版地理八年级下册《四大地理区域的划分》教案1
- 苏教版二年级下册数学(全册)同步随堂练习一课一练
评论
0/150
提交评论