全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6.6 布线问题算法设计思想:采用分支限界法求解。首先将问题转化为一颗解空间树:树根为线头,树高为线头到线尾的格数,每个节点有4个孩子,代表下一格可以朝4个方向。这样,布线问题就是搜索从树根到代表线尾节点的一条最短路径。分支限界法的本质是对解空间树的BFS(广度优先)搜索,即每进一格就将状态入队,而后再依次将出队的每个状态的子状态入队,直到到达所求的状态节点即线尾。该问题的剪枝条件显而易见,即当遇到电路板上的封锁标记时进行剪枝。为了方便剪枝,算法开始进行了预处理,在电路板周围加上了一圈“围墙”(虚拟的封锁标记),使搜索路径时对边界的处理与对封锁标记的处理统一。因为该问题BFS的队列中,并没有明显的优先级,所以该算法采用普通队列式。除了上述三点之外,程序对鲁棒性做了增强,对非法输入和文件错误进行了检测。程序设计代码: /*头文件 布线问题.h*/#ifndef KNAP_H#define KNAP_H#include #include #include using namespace std;class position/位置类public:int row;/行坐标int column;/列坐标bool operator=(const position &b) const/重载运算符=,表示位置相同if(row = b.row & column = b.column)return true;elsereturn false;position& operator=(const position &b)/重载运算符=,位置赋值this-row = b.row;this-column = b.column;return *this;position operator+(const position &b)const/重载运算符+,表示移动一格position temp;temp.row = row + b.row;temp.column = column + b.column;return temp;class Wiring/布线类public:Wiring(char *in, char *out);/构造函数Wiring();/析构函数void Solve();/输出结果到文件protected:bool FindPath();/找出布线方案void PrintPath();/输出结果布线方案void PrintFail();/输出没有路径信息private:int n, m;/电路板行列数int *grid;/电路板格子position start, finish;/起点和终点position *nextstep;/下一步四个方向ofstream fout;/输出结果文件;#endif/*函数实现文件 布线问题.cpp*/#include 布线问题.hWiring:Wiring(char *in, char *out) : fout(out)ifstream fin(in);if( !fin )cerr 文件 in 无法打开! n m;/初始化电路板大小n*mgrid = new int*n+2;for(int i = 0; i = n+1; i+)gridi = new intm+2;if(i = 0 | i = n+1)/加上下围墙for(int j = 0; j = m+1; j+)gridij = 1;elsegridi0 = gridim+1 = 1;/加左右围墙for(int j = 1; j gridij;fin start.row start.column;/初始化起点和终点fin finish.row finish.column;fin.close();nextstep = new position4;nextstep0.row = 0; nextstep0.column = 1;/右nextstep1.row = 1; nextstep1.column = 0;/下nextstep2.row = 0; nextstep2.column = -1;/左nextstep3.row = -1; nextstep3.column = 0;/上if( !fout )cerr 文件 out 无法打开! endl;exit(1);Wiring:Wiring()if(fout)fout.close();for(int i = 0; i = n+1; i+)if(gridi)delete gridi;if(grid)delete grid;void Wiring:Solve()if(FindPath()PrintPath();/输出路径elsePrintFail();/无路径bool Wiring:FindPath()if(start = finish)/如果起点和终点重合return 0;position here, near;/当前位置和相邻的一个位置gridstart.rowstart.column = 2;/开始点步数记为2list Queue;/辅助队列Queue.push_back(start);/初始位置是起点while(1)here = Queue.front();/取队尾位置Queue.pop_front();for(int i = 0; i 0; i-)/找前趋位置gridhere.rowhere.column = -1;/表示在路径上for(int j = 0; j 4; j+)near = here + nextstepj;if(gridnear.rownear.column = i+1)/找到前趋break;here = near;/向前移动for(int i = 1; i = n; i+)int j;for(j = 1; j = m; j+)if(gridij = -1)/表示路径fout *tt;elsefout gridij tt;fout endl;void Wiring:PrintFail()fout No Path! endl;/*主函数文件 test.cpp*/#include
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 8万吨年特种胺新材料产业化项目可行性研究报告写作模板-申批备案
- 2024-2025学年浙江省高考模拟卷及参考答案
- 企业食堂卫生检查制度
- 幼儿园室内空气质量管理制度
- 大班安全教案详案《火的安全》
- 二年级上册数学教案-8 数学广角-搭配 ︳人教新课标
- 《长相思》说课稿
- 二年级下册数学教案-1.3《练习课教案》-人教新课标
- 一年级上数学教案-数一数-人教新课标2014秋
- 2024年制压缩机买卖协议
- 粤语学习课程全套
- 《数字影音处理》课程标准
- 小学每周学习计划表
- 电动叉车堆垛车日常点检表
- 危险化学品和烟花爆竹安全管理
- 细胞工程学:第9章 植物离体受精
- 统编版高一语文必修上册主题写作:“生命的诗意”作文+课件19张
- 山东航空招飞报名表
- 第23课《孟子三章-富贵不能淫》对比阅读 (含答案)
- MORA-Super技术与功能(完整版)
- 第一单元劳动编织美好生活(教案)四年级上册综合实践活动劳动教育通用版
评论
0/150
提交评论