实验二 电路布线问题Word文档下载推荐.docx

上传人:b****2 文档编号:14824366 上传时间:2022-10-25 格式:DOCX 页数:22 大小:80.61KB
下载 相关 举报
实验二 电路布线问题Word文档下载推荐.docx_第1页
第1页 / 共22页
实验二 电路布线问题Word文档下载推荐.docx_第2页
第2页 / 共22页
实验二 电路布线问题Word文档下载推荐.docx_第3页
第3页 / 共22页
实验二 电路布线问题Word文档下载推荐.docx_第4页
第4页 / 共22页
实验二 电路布线问题Word文档下载推荐.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

实验二 电路布线问题Word文档下载推荐.docx

《实验二 电路布线问题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验二 电路布线问题Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。

实验二 电路布线问题Word文档下载推荐.docx

随机给定一个线路分布矩阵,利用穷举法,通过栈的应用,求出从a到b的可能布线线路;

采用层次优先搜索,通过队列的应用,求出a到b的最优布线线路。

1.4测试数据

测试数据为随机生成的矩阵。

2.概要设计

2.1抽象数据类型

需要定义一个位置类型的数据,里面包含int型的x和y坐标,用来记录位置信息;

再定义一个SWire的通道块数据类型,里面包含该通道块的位置数据,在路径上的序号和方向信息;

另外还需要构建栈和队列的基本结构类型。

2.2主程序流程及各模块之间的调用关系

3.详细设计

3.1存储结构实现

typedefstruct{//位置

intx;

inty;

}Position;

typedefstruct{//移动标记

intord;

Positionseat;

intdi;

}SWire;

typedefstruct{//栈

SWire*base;

SWire*top;

intstacksize;

}Stack;

typedefstructQNode{//队列

Positiondata;

structQNode*next;

}QNode,*QP;

typedefstruct{

QPfron;

QPrear;

}LinkQ;

3.2负责模块的伪码算法

(1)intWirePath(int**Board,Positionstart,Positionfinish){

//寻找路径算法

//若有从电路板的入口start到出口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(电路板的搜寻图)

}

return1;

//返回

NextPos(curpos,1);

//下一位置是当前位置的东邻

curstep++;

//探索下一步

else{//当前位置不能通过

Pop(S,e);

if(S.top!

=S.base){//栈空

while(e.di==5&

&

S.top!

=S.base){

MarkPrint(e.seat);

//留下不能通过的标记,并退回一步

}

if(e.di<

5){

e.di++;

//换下一个方向探索

NextPos(e.seat,e.di);

//设定当前位置是该新方向

//上的相邻块

curpos.x=e.seat.x;

curpos.y=e.seat.y;

}while(S.base!

=S.top);

printf(没有通路);

printf(电路板的搜寻图);

return0;

}

(2)intFindShortWay(int**Board,Positionstart,Positionfinish){

//搜寻最短布线路径算法

if(finish==start){//到达终点,结束

MShortPath=0;

//标记当前位置

if(Board[start.x][start.y]==0){没有通路!

return0;

Board[start.x][start.y]=2;

//有通路,则令其值为2

while

(1){//将第一个通道块赋值2,并将其相邻通道块从右开始,按顺时

//针依次入队列,当队列不空时,出队列一个通道块,对其相邻通道块做相

//同操作,直至所有的未标记通路通道块都被标记后为止。

for(i=1;

i<

5;

i++){//对其相邻通道块赋值

neighbour=curpos;

NextPos(neighbour,i);

if(Board[neighbour.x][neighbour.y]==1||Board[neighbour.x][neighbour.y]==-1||Board[neighbour.x][neighbour.y]==-3){//该通道块可通过且未标记

Board[neighbour.x][neighbour.y]=Board[curpos.x][curpos.y]+1;

//值+1

if(neighbour==finish)break;

//到达终点,结束

EnQ(Q,neighbour);

//将该通道块入队列

}//if

}//for

//已全部标记,结束循环

if(Q.fron==Q.rear){return0;

}//没有通路,结束

DeQ(Q,curpos);

//出队列

}//while

//反向搜寻最短布线路径

MShortPath=Board[neighbour.x][neighbour.y]-2;

path[MShortPath]=(0,0);

curpos=finish;

//标记当前位置为结束位置

for(j=MShortPath-1;

j>

=0;

j--){//反向搜索最短路径

path[j]=curpos;

for(i=0;

i++){//在相邻通道块中找符合的标记值

neighbour=curpos;

if(Board[neighbour.x][neighbour.y]==j+2){break;

curpos=neighbor;

//当前位置为相邻通道块

printf(输出最短布线路径);

printf(输出最短路径搜寻矩阵);

4.调试分析

4.1问题分析与解决方法

(1)寻找可能路径

若当前位置可通过,则纳入当前路径,并继续朝着下一位置探索,即切换下一位置为当前位置,如此重复直至到达出口;

若当前位置不可通,则应顺着来向退回到前一通道块,然后朝着除来向之外的其他方向继续探索;

若该通道块的四周4个方块均不可通,则应从当前路径上删除该通道块。

所谓下一位置指的是当前位置四周4个方向(东南西北)上相邻的方块。

假设以栈S记录当前路径,则栈顶中存放的是当前路径上的最后一个通道块。

由此,纳入路径的操作即为当前位置入栈;

从当前路径上删除前一通道块的操作即为出栈。

通过入栈和出栈操作,使得当前位置找寻到出口位置,从而实现对迷宫一个可能路径的求解。

(2)寻找最优路径

标记当前位置,通过队列,将当前位置周围的四个通道块入队列,将当前位置标记值m后,出队列,对该通道块执行相同的操作,并标记值m++,通过循环操作,直到当前位置为出口时终止。

借助队列,通过循环操作,使每个通道块都被赋值。

然后标记当前位置为出口,从出口向入口寻找符合递减值的通道块,从而确定出最短路径。

4.2算法的时空分析

时间复杂度:

空间复杂度:

4.3算法的改进设想

通过对搜寻可能路径的算法改进,实现能够同时输出多条可能路径的功能。

而最优路径也有可能有多条,因此可以改进搜索最优路径的算法,使其能够输出全部的最优路径。

可以考虑加入多重标记的方法实现。

4.4经验和体会

电路板布线问题实际上就是迷宫求解问题,电路板上的布线要求可以转化成迷宫的通路和不通路的问题,当电线可以经过该点时,该点即为通路,而当电线不能经过该点时,它即为死路,利用1,0分别表示通路和死路,就可以建立类似迷宫求解的模型,通过栈和队列的一系列数据结构的辅助,来求解迷宫问题。

5.使用说明

运行程序,系统会自动给出一个随机电路板矩阵,自动输出一个可能的布线路径和最优布线路径,并给出搜寻路径的标记图;

若该电路板不存在可行路径,则会提示没有通路。

6.测试结果(截屏)

(1)随机生成的电路板矩阵:

(2)可能布线路径:

(3)最短布线路径:

7.附录

7.1个人负责模块的程序代码

intWirePath(int**Board,Positionstart,Positionfinish){//寻找路径算法

inti,j;

StackS;

SWiree;

Positioncurpos;

intcurstep;

curpos.x=start.x;

curpos.y=start.y;

if(Pass(S,curpos)){//当前位置可通过,即未走过

e.ord=curstep;

e.seat.x=curpos.x;

e.seat.y=curpos.y;

e.di=1;

if(curpos.x==finish.x&

curpos.y==finish.y){//到达终点

printf("

\n搜寻路径图(-3表示布线,-1表示死路):

\n"

);

n;

i++){

for(j=0;

j<

j++){

%d\t"

Board[i][j]);

//下一个位置是当前位置的东邻

while(e.di==5&

//留下不能通过标记

//退一步

//换下一个方向探索

//设定当前位置是该新方向上的相邻块

没有通路!

\n\n搜寻路径图(-3表示布线,-1表示死路):

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1