6-4布线问题(分支限界)
6-4布线问题(分支限界)
一、问题描述
印刷电路板将布线区域划分成m*n个方格阵列,如图(1)所示。
精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。
在布线时,电路只能沿直线或直角布线,如图(2)所示。
为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。
二、分析
算法的思想: 队列式分治限界法
每个点的下一步有四个可选位置(上下左右)
解空间树是4叉树
位置偏移量:
int go[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //上下左右
int m,n;//m行n列;
int grid[100][100];
struct node{
int x;
int y;
};
node start,end;//从start到end
//初始化
void Init(){//初始化 for(int i=0;i<=m+1;i++){for(int j=0;j<=n+1;j++){if(i==0||j==0||i==m+1||j==n+1)grid[i][j]=-1;//四周初始化为-1 else grid[i][j]=INF; //其余初始化为无穷大}}
}
//广搜+剪枝
剪枝策略:新扩展的该位置路径长度小于该位置已记录的值
bool IsEnd(node t){//判断到没到终点 if(t.x==end.x&& t.y==end.y) //到终点了 return true;else return false;
}
bool FindPath(){//广搜 if(IsEnd(start)) return true;//判断起点是不是等于终点queue<node>q;int newx,newy; node no;q.push(start);//起点入队 while(!q.empty() ){no=q.front(); q.pop();//取出队首 for(int i=0;i<4;i++) { //四个方向上下左右 newx=no.x+go[i][0];newy=no.y+go[i][1];if(grid[no.x][no.y]+1 < grid[newx][newy]){//剪枝 grid[newx][newy] = grid[no.x][no.y]+1;node t;t.x = newx;t.y = newy;if(IsEnd(t)) return true;//到终点了 else q.push(t); //否则入队 } }}return false;
}
构造最优解
void BestL(int x,int y){//构造最优解 int newx,newy;for(int i=3;i>=0;i--) {newx=x+go[i][0];newy=y+go[i][1];if(grid[x][y]==grid[newx][newy]+1){BestL(newx,newy);cout<<"("<<newx<<","<<newy<<") -> ";break;}}return;
}
三、完整代码
//6-4布线问题
//队列式分支限界 4叉树
#include<iostream>
#include<queue>
#define INF 0x3f3f
using namespace std;
int m,n;//m行n列;
int grid[100][100];
int go[5][3]={{-1,0},{1,0},{0,-1},{0,1}};//上下左右
struct node{int x;int y;
};
node start,end;//从start到end
void Init(){//初始化 for(int i=0;i<=m+1;i++){for(int j=0;j<=n+1;j++){if(i==0||j==0||i==m+1||j==n+1)grid[i][j]=-1;//四周初始化为-1 else grid[i][j]=INF; //其余初始化为无穷大}}
}
void Print(){for(int i=0;i<=m+1;i++){for(int j=0;j<=n+1;j++){printf("%5d ",grid[i][j]);}cout<<endl;}
}
bool IsEnd(node t){//判断到没到终点 if(t.x==end.x&& t.y==end.y) //到终点了 return true;else return false;
}
bool FindPath(){//广搜 if(IsEnd(start)) return true;//判断起点是不是等于终点queue<node>q;int newx,newy; node no;q.push(start);//起点入队 while(!q.empty() ){no=q.front(); q.pop();//取出队首 for(int i=0;i<4;i++) { //四个方向上下左右 newx=no.x+go[i][0];newy=no.y+go[i][1];if(grid[no.x][no.y]+1 < grid[newx][newy]){//剪枝 grid[newx][newy] = grid[no.x][no.y]+1;node t;t.x = newx;t.y = newy;if(IsEnd(t)) return true;//到终点了 else q.push(t); //否则入队 } }}return false;
}
void BestL(int x,int y){//构造最优解 int newx,newy;for(int i=3;i>=0;i--) {newx=x+go[i][0];newy=y+go[i][1];if(grid[x][y]==grid[newx][newy]+1){BestL(newx,newy);cout<<"("<<newx<<","<<newy<<") -> ";break;}}return;
}
int main(){int t;//障碍物的个数 int x,y;cin>>m>>n;Init();//初始化为无穷大,四周初始化为-1 cin>>start.x>>start.y>>end.x>>end.y;//输入起点和终点 cin>>t;while(t--){cin>>x>>y;grid[x][y]=-1;}grid[start.x][start.y]=0;if(FindPath()){cout<<"minlen="<<grid[end.x][end.y]<<endl;BestL(end.x,end.y);cout<<"("<<end.x<<","<<end.y<<")\n";} else{cout<<"("<<start.x<<","<<start.y<<")到不了("<<end.x<<","<<end.y<<")\n";}Print();return 0;
}
/*有路
7 7
3 2 4 6
14
1 3
2 3
2 4
3 5
4 4
4 5
5 5
5 1
6 1
6 2
6 3
7 1
7 2
7 3
*/
/*
没有路的情况
7 7
3 2 4 6
14
1 3
2 3
2 4
3 5
4 4
4 5
5 5
5 1
5 4
6 1
6 2
6 3
7 2
7 3
*/
有最短路
没有最短路
6-4布线问题(分支限界)相关推荐
- 布线问题(分支限界)
问题描述: 印刷电路板将布线区域划分成n×m个方格.精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案.在布线时,电路只能沿直线或直角布线.为了避免线路相交,已布了线的方格做了封锁 ...
- 分支限界——布线问题
分支限界--布线问题 问题: 印刷电路板将布线区域划分成n×m个方格如图a所示.精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案.在布线时,电路只能沿直线或直角布线,如图b所示. ...
- 相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界
相似算法比较:递归.分治.动态规划.贪心.回溯.分支限界 在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们 ...
- 算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较
在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的,我来给同学们整理一下. 一.算法思想 ...
- 最速下降法极小化rosenbrock函数 代码_典型算法思想与应用9|分支限界法与电路布线问题
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树. (1) 在分支限界法中,每一个活结点只有一次机会成为扩展结点.活结点一旦成为扩展结点,就一次性产生其所有儿子结点. (2) ...
- 实验十一 电路布线问题
<算法设计与分析>实验报告 所在院系 计算机与信息工程学院 学生学号 学生姓名 年级专业 2020级计算机科学与技术 授课教师 彭绪富 学 期 2022-2 ...
- 电路布线问题(分支限界法)
一.问题描述 印刷电路板将布线区域划分成n*m个方格阵列. 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案. 在布线时,电路只能沿直线或直角布线. 为了避免线路相交,已布了线的 ...
- 16 导出pcb各网络的布线长度_设计PCB流程
1. 准备--功能确定.元器件选型(主要核心元器件) 2. 元件库建立--元器件符号.元器件封装 3. 绘制原理图--根据电路功能,将元器件符号进行连接 4. 导出网络表--将元器件的连接关系,以及元 ...
- ENJOYLink欢联,以独创技术满足数据中心布线
[导读]对于占有一栋建筑物或一个建筑群的数据中心来说,如何进行布线尤其关键. 随着各行各业对大数据技术的需求日益增长,数据中心新一轮快速发展已经开始.作为数据中心的基础设施,综合布线系统既要满足机房网 ...
最新文章
- python中的列表生成式_Python中的列表生成式
- Spring Cloud第六章:配置中心Config
- ai里为什么不能随意放大缩小_平面设计基础知识:平面设计师应该熟练掌握的软件之AI。...
- ABAP动态创建数据DATA或对象Object
- python【力扣LeetCode算法题库】20- 有效的括号(辅助栈)
- webService的简单使用
- 【CyberSecurityLearning 63】CSRF攻击
- Weird Game CodeForces - 299C
- python使用spark sql查询impala_如何使用JDBC将Impala表直接加载到Spark?
- c语言设计一维数组,一维数组 (1)C语言程序设计.pdf
- CoffeeScript简介 一
- java mvc 源码分析_SpringMVC 源码解读笔记
- Django项目实践2 - Django模板语言(常用语法规则)
- 自己动手源码包制作rpm 包 (二)
- Atitit rest框架选型总结 Resteasy 实现 但是麻烦 作为JAX-RS的标准实现,RestEasy还具有以下亮点特性: 1)不需要配置文件,只要把JARs文件放到类路径里面
- [963]Android app代理软件
- Android实现MP4边下边播(边缓存边播放、在线播放)原理与代码
- C++银行账户管理程序1
- 解决执行hive语句时出现虚拟内存不够的问题
- 使用AppNode部署IT资产管理平台(Chemex 3.2.0版本)- 肥仔Sam
热门文章
- steam怎么设置邮箱令牌_steam收不到邮箱令牌验证码怎么办 这些知识你不一定知道...
- 卷积神经网络入门:LeNet5(手写体数字识别)详解
- 游戏安全反汇编分析开启取消自动攻击call
- bootstrap4 调整元素之间距离 margin 和padding
- SVN Git GitHub Gitee GitLab区别
- poll, ppoll
- steamship 使用gpt-4
- 10M,50M,100M宽带下载速率解惑之网络基础知识
- 前端面试题,前端组件化、工程化、模块化的概念
- 矩型窗、哈明窗、汉宁窗、莱克曼窗等一系列函数