1、实验二 电路布线问题1. 问题定义及需求分析1.1 课题目的和任务问题描述:印刷电路板将布线区域划分为 nn 个方格阵列。在布线时,电路只能沿直线或直角布线。为避免线路相交,已布线的方格要做封锁标记。设起始位置为 a,终止位置为 b,求解电路布线问题。实验要求:设计印刷电路板的布线模拟程序。1)采用栈或队列等数据结构。2)采用穷举法的回溯搜索,求 a 到 b 可能的布线线路。3)推荐采用层次优先搜索,求 a 到 b 最优的布线线路。1.2 数据形式输入数据形式:通过生成随机数的函数随机生成一个矩阵。输入值的范围:生成的矩阵中的数值为 int 型,为 0 或者 1,其中 0 表示死路,1 表示通
2、路。 输出数据形式:输出到显示器。1.3 程序功能随机给定一个线路分布矩阵,利用穷举法,通过栈的应用,求出从a 到 b 的可能布线线路;采用层次优先搜索,通过队列的应用,求出 a到 b 的最优布线线路。1.4 测试数据测试数据为随机生成的矩阵。2. 概要设计2.1 抽象数据类型需要定义一个位置类型的数据,里面包含 int 型的 x 和 y 坐标,用来记录位置信息;再定义一个 SWire 的通道块数据类型,里面包含该通道块的位置数据,在路径上的序号和方向信息;另外还需要构建栈和队列的基本结构类型。2.2 主程序流程及各模块之间的调用关系开 始随 机 生 成 电 路 板 矩阵 CreateBoar
3、d()利 用 栈 搜 索 可 能 路径 WirePath()输 出 可 能 路径 和 搜 索 图利 用 队 列 搜 索 最 短路 径 FindShortway()输 出 可 能 路径 和 搜 索 图结 束3. 详细设计3.1 存储结构实现typedef 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/队列Positio
4、n data;struct QNode* next;QNode,*QP;typedef structQP fron;QP rear;LinkQ;3.2 负责模块的伪码算法(1)int WirePath(int* Board,Position start,Position finish)/寻找路径算法/若有从电路板的入口 start 到出口 end 的通道,则求得一条存放在栈中/(从栈底到栈顶)InitStack(S);curpos=start;/设定当前位置为入口位置curstep=1;/探索第一步doif(Pass(S,curpos)/当前位置可通过,即是未曾走到的通道块FootPrint(
5、curpos);/留下足迹e=(curstep,curpos,1);Push(S,e);/加入路径if(curpos=finish)/到达出口(终点)PrintStack(S);/输出路径Printf(电路板的搜寻图)return 1;/返回NextPos(curpos,1);/下一位置是当前位置的东邻curstep+;/探索下一步else/当前位置不能通过Pop(S,e);if(S.top!=S.base)/栈空while(e.di=5Pop(S,e);/留下不能通过的标记,并退回一步if(e.di=0;j-)/反向搜索最短路径pathj=curpos;for(i=0;i=0;j-)/反向搜
6、寻符合值pathj=curpos;for(i=0;i“);for(i=0;pathi.x!=0i+)printf(“(%d,%d)“,pathi.x,pathi.y);if(pathi.x!=8|pathi.y!=8)printf(“-“);printf(“n“);/输出最短路径搜寻矩阵printf(“n 搜寻路径图:n“);for(i=0;i#includeusing namespace std;#include#include#define SIZE 100#define INCH 10typedef struct/位置int x;int y;Position;typedef struct
7、/移动标记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 structQP fron;QP rear;LinkQ;int* Board;/电路板int MShortPath;/最短路径const int n=10;/电路板大小int CreateBoard()/创建一个电路板int i,j;Board=(int
8、*)malloc(sizeof(int*)*(n);for(i=0;i=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+;return 1;int Pop(Stack e=*(-S.top);return 1;int NextPos(Positionif(i=2)f.x+;if(i=3)f.y-;if(i=4)f.x-;return 1;
9、int MarkPrint(Position f)/留下不可布线的标志Boardf.xf.y=-1;return 1;int PrintStack(Stackif(S.base-seat.x=8S.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);curpos.x=start.x;curpos.y=
10、start.y;curstep=1;doif(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.xprintf(“n 搜寻路径图 (-3 表示布线,-1 表示死路):n“);for(i=0;inext=NULL;return 1;int DestroyQ(LinkQfree(Q.fron);Q.fron=Q.rear;return 1;int EnQ(LinkQp=(QP)malloc(sizeof(QNode
11、);if(!p)return 0;p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;return 1;int DeQ(LinkQQP p;p=Q.fron-next;e=p-data;Q.fron-next=p-next;if(Q.rear=p)Q.rear=Q.fron;free(p);return 1;int FindShortWay(int* Board,Position start,Position finish)/搜寻最短布线路径算法if(finish.x=start.xreturn 1;LinkQ Q;InitQ(Q);int i;Positi
12、on 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)for(i=1;i=0;j-)pathj=curpos;for(i=0;i“);for(i=0;pathi.x!=0i+)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;int main()/主函数Position start,finish;start.x=1;start.y=1;finish.x=8;finish.y=8;CreateBoard();printf(“n 可能布线路径为: “);WirePath(Board,start,finish);printf(“n 最短布线路径为: “);FindShortWay(Board,start,finish);return 0;