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布线问题(分支限界)相关推荐

  1. 布线问题(分支限界)

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

  2. 分支限界——布线问题

    分支限界--布线问题 问题: 印刷电路板将布线区域划分成n×m个方格如图a所示.精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案.在布线时,电路只能沿直线或直角布线,如图b所示. ...

  3. ​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​

    相似算法比较:递归.分治.动态规划.贪心.回溯.分支限界 ​ 在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们 ...

  4. 算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较

    在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的,我来给同学们整理一下. 一.算法思想 ...

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

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

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

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

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

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

  8. 16 导出pcb各网络的布线长度_设计PCB流程

    1. 准备--功能确定.元器件选型(主要核心元器件) 2. 元件库建立--元器件符号.元器件封装 3. 绘制原理图--根据电路功能,将元器件符号进行连接 4. 导出网络表--将元器件的连接关系,以及元 ...

  9. ENJOYLink欢联,以独创技术满足数据中心布线

    [导读]对于占有一栋建筑物或一个建筑群的数据中心来说,如何进行布线尤其关键. 随着各行各业对大数据技术的需求日益增长,数据中心新一轮快速发展已经开始.作为数据中心的基础设施,综合布线系统既要满足机房网 ...

最新文章

  1. python中的列表生成式_Python中的列表生成式
  2. Spring Cloud第六章:配置中心Config
  3. ai里为什么不能随意放大缩小_平面设计基础知识:平面设计师应该熟练掌握的软件之AI。...
  4. ABAP动态创建数据DATA或对象Object
  5. python【力扣LeetCode算法题库】20- 有效的括号(辅助栈)
  6. webService的简单使用
  7. 【CyberSecurityLearning 63】CSRF攻击
  8. Weird Game CodeForces - 299C
  9. python使用spark sql查询impala_如何使用JDBC将Impala表直接加载到Spark?
  10. c语言设计一维数组,一维数组 (1)C语言程序设计.pdf
  11. CoffeeScript简介 一
  12. java mvc 源码分析_SpringMVC 源码解读笔记
  13. Django项目实践2 - Django模板语言(常用语法规则)
  14. 自己动手源码包制作rpm 包 (二)
  15. Atitit rest框架选型总结 Resteasy 实现 但是麻烦 作为JAX-RS的标准实现,RestEasy还具有以下亮点特性:   1)不需要配置文件,只要把JARs文件放到类路径里面
  16. [963]Android app代理软件
  17. Android实现MP4边下边播(边缓存边播放、在线播放)原理与代码
  18. C++银行账户管理程序1
  19. 解决执行hive语句时出现虚拟内存不够的问题
  20. 使用AppNode部署IT资产管理平台(Chemex 3.2.0版本)- 肥仔Sam

热门文章

  1. steam怎么设置邮箱令牌_steam收不到邮箱令牌验证码怎么办 这些知识你不一定知道...
  2. 卷积神经网络入门:LeNet5(手写体数字识别)详解
  3. 游戏安全反汇编分析开启取消自动攻击call
  4. bootstrap4 调整元素之间距离 margin 和padding
  5. SVN Git GitHub Gitee GitLab区别
  6. poll, ppoll
  7. steamship 使用gpt-4
  8. 10M,50M,100M宽带下载速率解惑之网络基础知识
  9. 前端面试题,前端组件化、工程化、模块化的概念
  10. 矩型窗、哈明窗、汉宁窗、莱克曼窗等一系列函数