算法设计与分析——分支限界法——布线问题

本文探讨了印刷电路板的精确布线问题,利用分支限界法寻找从点a到点b的最短布线路径。算法避免线路相交,通过标记封锁方格并进行队列式的广度优先搜索,逐步扩展并更新活结点队列,直至找到目标或队列为空。整个过程结合C++实现,展示了如何应用分支限界解决实际问题。

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

一个布线的例子:图中包含障碍。起始点为a,目标点为b。
在这里插入图片描述

算法思想:

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

接着,算法从活结点队列中取出队首结点作为下一个扩展结点,并将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。这个过程一直继续到算法搜索到目标方格b或活结点队列为空时为止。即加入剪枝的广度优先搜索
使用的c++普通队列解决问题

#include<iostream>
using namespace std;
#include<queue> 
#include<bits/stdc++.h>
class Position{
   
   
	public:
		int row;//行 
		int col;//列 
};
const int m=7;//列数 
const int n=7;
int gird[n+2][m+2];
bool FindPath(Position start,Position finish,int &PathLen,Position *&path)
{
   
   
	if((start.col == finish.col)&&(start.row == finish.row ))//起点和终点是同一个点时 
	{
   
   
		PathLen = 0;
		return true;
	}

	  //初始化相对位移
	  Position offset[4];
	  //右 
	  offset[0].col =0;
	  offset[0].row =1; 
	  //下
	  offset[1].col =1;
	  offset[1].row =0;
	  
	  //左
	  offset[2].col =0;
	  offset[2].row =-1;
	  
	  //上 
	  offset[3].col =-1;
	  offset
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值