【分支限界法】布线问题

印刷电路板将布线区域划分成n×m个方格如图a所示。精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,如图b所示。为了避免线路相交,已布了线的方格做了封锁标记,其它线路不允穿过被封锁的方格。

一个布线的例子:图中包含障碍。起始点为a,目标点为b。

解此问题的队列式分支限界法从起始位置a开始将它作为第一个扩展结点。与该扩展结点相邻并且可达的方格成为可行结点被加入到活结点队列中,并且将这些方格标记为1,即从起始方格a到这些方格的距离为1。

 接着,算法从活结点队列中取出队首结点作为下一个扩展结点,并将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。这个过程一直继续到算法搜索到目标方格b或活结点队列为空时为止。即加入剪枝的广度优先搜索。
// Position.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include<queue>using namespace std;template<class Type>
class Position
{public:Position(Type x, Type y) :row(x), col(y) {}Position() {}template<class Type>friend bool FindPath(Position<Type>, Position<Type>, Type& Path, Position<Type>*&,Type **grid);
private:Type row,col;
};template<class Type>
bool FindPath(Position<Type> start, Position<Type> end, Type& Pathlen, Position<Type>* &path, Type** grid)
{Position<Type> offset[4];(offset[0]).row = 0, (offset[0]).col = 1;(offset[1]).row = 0, (offset[1]).col = -1;(offset[2]).row = 1, (offset[2]).col = 0;(offset[3]).row = -1, (offset[3]).col = 0;Position<Type> here, nbr;here.col = start.col;here.row = start.row;grid[here.row][here.col] = 2;queue< Position<Type>> Q;do {for (int i = 0; i < 4; i++){nbr.row = here.row + offset[i].row;nbr.col = here.col + offset[i].col;if ((nbr.row>=1&& nbr.row<=7)&& (nbr.col >= 1 && nbr.col <= 7)&& (grid[nbr.row][nbr.col] == 0)){grid[nbr.row][nbr.col] = grid[here.row][here.col] + 1;if (nbr.row == end.row && nbr.col == end.col)break;Q.push(nbr);  }}if (nbr.row == end.row && nbr.col == end.col)break;if (Q.empty())return false;here = Q.front();Q.pop();}while (true);for (int i = 1; i < 8; i++) {for (int j = 1; j < 8; j++){cout << grid[i][j] << "\t";}cout << endl;}here = end;Pathlen = grid[end.row][end.col] - 2;path = new Position<Type>[Pathlen];for (int j = Pathlen - 1; j >= 0; j--){path[j] = here;for (int i = 0; i < 4; i++){nbr.row = here.row + offset[i].row;//行if ((nbr.row >= 1 && nbr.row <= 7) && (nbr.col >= 1 && nbr.col <= 7)&&grid[nbr.row][nbr.col] == j + 2)break;}here = nbr;}for (int j = Pathlen - 1; j >= 0; j--){cout << path[j].row << "  " << path[j].col << endl;}return true;
}
int main()
{Position<int> start(3,2);Position<int> end(4, 6);int Pathlen = 0;Position<int>* path = nullptr;int** grid;grid = new int* [8];for (int i = 0; i < 8; i++)grid[i] = new int[8];for (int i = 0; i < 8; i++)for (int j = 0; j < 8; j++)grid[i][j] = 0;for (int i = 0; i < 8; i++)grid[i][0] = 1;for (int i = 0; i < 8; i++)grid[0][i] = 1;grid[5][1] = 1, grid[6][1] = 1, grid[7][1] = 1;grid[6][2] = 1, grid[7][2] = 1;grid[6][3] = 1, grid[7][3] = 1;grid[3][5] = 1, grid[4][4] = 1, grid[4][5] = 1, grid[5][5] = 1;grid[1][3] = 1, grid[2][3] = 1, grid[2][4] = 1;cout << FindPath<int>(start, end, Pathlen, path, grid) << endl;;return 0;
}

布线问题 分支限界法相关推荐

  1. 布线问题分支限界法java_大型布线:Java云应用程序缺少的技术

    布线问题分支限界法java 您是否曾经想过,为什么大多数Java框架中的依赖项注入仅用于本地进程内服务而不是分布式服务? 我最近在2013年EMC世界大会上遇到了Paul Maritz的主题演讲 (跳 ...

  2. 布线问题-分支限界法

    2019独角兽企业重金招聘Python工程师标准>>> 问题描述: 印刷电路板不限区域划分成n*m个方格阵列.如下图所示 精确的电路布线问题要求确定连接方格a的中点,到连接方格b的中 ...

  3. 最速下降法极小化rosenbrock函数 代码_典型算法思想与应用9|分支限界法与电路布线问题

    分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树. (1) 在分支限界法中,每一个活结点只有一次机会成为扩展结点.活结点一旦成为扩展结点,就一次性产生其所有儿子结点. (2) ...

  4. 电路布线问题(分支限界法)

    一.问题描述 印刷电路板将布线区域划分成n*m个方格阵列. 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案. 在布线时,电路只能沿直线或直角布线. 为了避免线路相交,已布了线的 ...

  5. 分支限界法求解电路布线问题

    分支限界法求解电路布线问题 #include <iostream> #include <queue> #include <stack> using namespac ...

  6. 分支界限法0 1背包 c语言,分支限界法之布线问题(1)

    一.要求: 1.输入电路板区域n*m以及布线的起始位置和结束位置: 2.输出布线方案: 3.可以使用c或者vc实现 二.问题分析及实验原理: 在n*m的方格阵列中存在封锁区域(布线时必须绕开的区域), ...

  7. 算法笔记之分支限界法

    广度优先 广度优先搜索,其实就是层次遍历,程序采用队列来实现. 算法思想 从根开始,常以BF或以最小耗费(即最大收益)优先的方式搜索问题的解空间树.首先将根结点加入活结点表,接着从活结点表中取出根结点 ...

  8. 实验十一 电路布线问题

    <算法设计与分析>实验报告         所在院系 计算机与信息工程学院 学生学号 学生姓名 年级专业 2020级计算机科学与技术 授课教师 彭绪富 学         期 2022-2 ...

  9. 五大经典算法(贪婪、动态规划、分治、回溯、分支限界法)及其联系和比较

    一.贪心法 贪心算法的含义: 贪心算法(也叫贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得 ...

最新文章

  1. 电子商务之表示层分析(九)
  2. java 32 questions
  3. centos g++ 升级_今夏最潮装备来了!G-SHOCK推出seethru 冰韧系列
  4. 经济学家炒股容易输是为什么
  5. pyqt5从子目录加载qrc文件_实战PyQt5: 045-添加资源文件
  6. 西北纺织工学院97级计算机系学生毕业名单,原西北纺织工学院更名为西安工程大学...
  7. magento 基本配置
  8. 2021-2025年中国顶级服务行业市场供需与战略研究报告
  9. 元素周期表排列的规律_高中化高中化学元素周期表六大常考规律与特征学元素周期表六大常考规律与特征...
  10. ROS防火墙规则收集
  11. Navicat 安装配置
  12. 网易微专业——Java Web开发工程师学习笔记(1):HTTP
  13. Caused by: org.apache.thrift.TApplicationException: Required field ‘filesAdded‘ is unset
  14. 计算机图标右击管理打不开,电脑图标打不开怎么办6
  15. Balsamiq Mockups的使用
  16. 计算机内存不足360杀毒,电脑内存经常不足到底怎么办
  17. PYTHON爬虫书籍
  18. S - 歌德巴赫猜想
  19. 【Cadence Virtuoso】IC617 入门操作 (MOS特性分析)
  20. 谁喝水谁养斑马答案C语言,一群斑马一起在河边喝水,意外打造出条码效果,让人有眩晕的视觉...

热门文章

  1. html中有序列表的css样式,CSS 列表样式
  2. 深度:拥有800万中老年消费会员,解密中老年消费品市场获客与变现的商业逻辑!
  3. IOS APP Store发布流程
  4. javascript调用百度API,文字转语音播放
  5. Maxthon侧边栏插件--上网小助手
  6. U盘插入电脑不显示解决办法
  7. 手机和电脑存在的屏闪
  8. 百度地图:层级地图、行政边界、圆形覆盖物、自定义覆盖物、可视化数据显示、放大及缩小、下拉滚动加载数据等...
  9. 穿越火线启动闪退、WeGame修复无效显示网络异常、Client MFC Application闪退、穿越火线游戏内乱码
  10. html 正则表达式替换标签,正则表达式替换 html 标签