布线问题(分支限界)

2023-11-09

问题描述:

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

电路板布线问题,对给定的电路板,找出最短的布线路径。

 

算法思路:

       布线问题的解空间是一个排列树。采用队列式分支限界从起始位置start开始,将其作为第一个可扩展的结点。与该扩展结点相邻(即上下左右四个方向)且可达的方格成为可行结点被加入到活结点队列中,并且将这些方格标记为1,即从起始位置start到这些方格的距离为1。然后从活结点队列取出队首结点作为下一个可扩展的结点,并将与当前扩展结点相邻且未被标记过的方格标记为2,并存入活结点队列。继续执行该算法直到搜索到终止结点finish或者队列为空为止。

    对于方格阵列的建立:用0表示可达且未被标记过的结点,用1表示该方格不可达。为了防止出界,可以在方格阵列外围用1建立不可达的“围墙”。由于0和1被使用过,起始位置可以从2开始,等价于将距离起始位置的标记距离都做了加2处理,那么实际距离为标记距离减2。

 

代码附录:

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef int Status;

//队列的最大长度 
#define MAXQSIZE 20

struct Position{
	int row;			// 行 
	int col;			// 列 
};
typedef Position QElemType;
// 循环队列
typedef struct{
	QElemType *base;
	int front;
	int rear;
}SqQueue;

//实现队列的一般功能
Status InitQueue(SqQueue &Q){
	Q.base = (QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
	if(!Q.base) exit(OVERFLOW);
	Q.front=Q.rear=0;
	return OK;
}

Status QueueEmpty(SqQueue Q){
	return Q.rear==Q.front;
}

Status EnQueue(SqQueue &Q,QElemType e){
	if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear+1) % MAXQSIZE;
	return OK;
}

Status DeQueue(SqQueue &Q,QElemType &e){
	if(Q.rear==Q.front) return ERROR;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return OK;
}

int n,			// n行 
	m;			// m列 
int **grid;		// 区域阵列 

Status FindPath(Position start, Position finish, int &PathLen, Position *&Path){
	if(start.col == finish.col && start.row == finish.row) {
		PathLen = 0;
		return TRUE;
	}
	
	// 初始化上下边界 
	for(int i=0; i<=m+1; i++) grid[0][i] = grid[n+1][i] = 1;
	// 初始化左右边界 
	for(int i=0; i<=n+1; i++) grid[i][0] = grid[i][m+1] = 1;
	Position offset[4];
	offset[0].row = 0;  offset[0].col = 1;
	offset[1].row = 1;  offset[1].col = 0;
	offset[2].row = 0;  offset[2].col = -1;
	offset[3].row = -1; offset[3].col = 0;
	int NumOfNbrs = 4;
	Position here, nbr;
	here.col = start.col; here.row = start.row;
	grid[start.row][start.col] = 2;
	// 初始化队列 
	SqQueue Q; InitQueue(Q);
	do{
		for(int i=0; i<NumOfNbrs; i++){
			nbr.row = here.row + offset[i].row;
			nbr.col = here.col + offset[i].col;
			if(grid[nbr.row][nbr.col] == 0){
				grid[nbr.row][nbr.col] = grid[here.row][here.col] + 1;
				if(nbr.row == finish.row && nbr.col == finish.col) break;
				EnQueue(Q,nbr);
			}
		}
		if(nbr.row == finish.row && nbr.col == finish.col) break;
		// 队列是否为空 
		if(QueueEmpty(Q)) return FALSE;
		DeQueue(Q,here);
	}while(TRUE);
	// 构造路径 
	PathLen = grid[finish.row][finish.col] - 2;
	Path = new Position[PathLen];
	here = finish;
	for(int j=PathLen-1; j>=0; j--){
		Path[j] = here;
		for(int i=0; i<NumOfNbrs; i++){
			nbr.row = here.row + offset[i].row;
			nbr.col = here.col + offset[i].col;
			if(grid[nbr.row][nbr.col] == j+2) break;
		}
		here = nbr;
	}
	return TRUE;
} 

测试用例:

运行结果:

补充:

int main(){
    int pathLength;
    Position start = {3,2};        // 起点
    Position finish = {4,6};       // 终点
    Position* path;
    FILE *file = fopen("test.txt","r");
    fscanf(file,"%d",&n); 
    fscanf(file,"%d",&m); 
    grid = new int *[n+2];
    for(int i = 1; i < n+2; i++){
    	grid[i] = new int [n+2];
    }
    for(int i = 1;i<=n;i++){
    	for(int j = 1; j<=n; j++) fscanf(file,"%d",&grid[i][j]);
    }
    fclose(file);
    FindPath(start,finish,pathLength,path);
    printf("从起始位置到结束位置经历的最少方格数:%d\n",pathLength);
    printf("从起始位置到结束位置经历的方格:");
    for(int i = 0; i < pathLength; i++){
    	printf("(%d,%d) ",path[i].row,path[i].col);
    }
    delete grid;
    return 0;
}

test.txt:

7
7
0 0 1 0 0 0 0
0 0 1 1 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 0 0
1 0 0 0 1 0 0
1 1 1 0 0 0 0
1 1 1 0 0 0 0

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

布线问题(分支限界) 的相关文章

  • 1.3. 分治法—最近点对问题

    1 问题描述 给定平面S上n个点 找其中的一对点 使得在n个点组成的所有点对中 该点对间的距离最小 2 求解过程 划分 将集合S分成两个大小基本相等的子集 S 1 S 1 S1 和 S
  • 数据结构——在一个有序表中,现在要插入一个元素,要求在插入后不改变表的有序性

    题目 在一个有序表中 现在要插入一个元素 要求在插入后不改变表的有序性 要求采用一种时间复杂度较低的算法 所采用的的数据结构不限 思想 本题有多种做法 但是最少的时间复杂度是申请一个新的顺序表 一次比较后插入 时间复杂度为O N 这是典型的
  • 寻找凸包

    问题 点集 Q 的凸包 convex hull 是一个最小的凸多边形 P Q 中的每个点或在 P 的边界上或 在 P 的内部 我们用 CH Q 表示点集 Q 的凸包 问题定义 输入 平面上的点集 Q 输出 Q 的凸包 CH Q a 请给出一
  • python算法中的深度学习算法之强化学习(详解)

    目录 学习目标 学习内容 强化学习 环境建模 Markov决策过程
  • 分治法求最近点对问题

    目录 蛮力法 分治法 探究分治规模小于一定程度时采用暴力解法 蛮力法 算法思想 蛮力法 顾名思义 即穷举所有点与点之间的距离 两层循环暴力找出最近点对 算法执行可视化如图1所示 word文档GIF静态显示 附件已含动图 图1 伪代码 mat
  • 数值概率算法

    基本概念 计算定积分 rand和srand 在解决设计问题时 有时会用到概率算法 概率算法允许在执行过程中随机的选择下一步的计算步骤 又是可使算法大大降低复杂度 提高算法效率 但有时也可能得不到问题的全部答案 基本概念 概率算法大致分为4类
  • 无向图的表示:邻接矩阵和邻接表

    这里将一个无向图用邻接表和邻接矩阵表示 输入 顶底个数n 图中的各个边 用两个顶点表示 输出 这个无线图的邻接矩阵和邻接表 其中邻接表中的链接按元素大小升序排列 先给出一个例子说明 假设有无向图如下 则其邻接矩阵和邻接表如提示框中所示 其实
  • 1 评价类算法:层次分析法笔记(附Python代码)

    什么是评价类问题 题干中要求你确定评价指标 形成评价体系 常见的评价类算法有 层次分析法 TOPSIS法 熵权法 变异系数法 主成分分析法等等 一 原理 简称AHP 是指将与决策总是有关的元素分解成目标 准则 方案等层次 在此基础之上进行定
  • 排序算法性能分析

    目录 实现插入排序 冒泡排序 选择排序 合并排序 快速排序算法 从小到大 插入排序 冒泡排序 选择排序 快速排序 五种排序 现在有10亿的数据 每个数据四个字节 请快速挑选出最大的十个数 并在小规模数据上验证算法的正确性 方法一 规模为10
  • 重新排列数组的数,使得负数都排在正数的前面

    重新排列数组的数 使得负数都排在正数的前面 问题描述 设A是由n个非0实数构成的数组 设计一个算法重新排列数组的数 使得负数都排在正数的前面 要求算法使用O n 的时间和O 1 的空间 解决思路 对于这样一个问题 我们最容易想到的思路是对数
  • 分治算法——求逆序对数

    分治求逆序对数 问题描述 在Internet上的搜索引擎经常需要对信息进行比较 比如可以通过某个人对一些事物的排名来估计他对各种不同信息的兴趣 从而实现个性化服务 对于不同的排名结果可以用逆序来评价他们之间的差异 考虑1 2 n的排列i1
  • 蓝桥杯——修改数组

    问题描述 给定一个长度为N的数组A A1 A2 AN 数组中有可能有重复出现的整数 在小明要按以下方法将其修改为没有重复整数的数组 小明会依次修改A2 A3 AN 当修改Ai时 小明会检查Ai是否在A1 Ai 1中出现过 如果出现过 则小明
  • 布线问题(分支限界)

    问题描述 印刷电路板将布线区域划分成n m个方格 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案 在布线时 电路只能沿直线或直角布线 为了避免线路相交 已布了线的方格做了封锁标记 其它线路不允穿过被封锁的方格 电路板
  • 回溯法解决地图填色问题

    目录 回溯法 最大度优先 最少可选颜色优先 向前探测 随机产生不同规模的图 分析算法效率与图规模的关系 四色 回溯法 回溯法的基本思想是采用递归和深度优先搜索的方法 尝试在一组可能的解中搜索出符合要求的解 在搜索过程中 若发现当前所选的方案
  • 分治算法——最邻近点对

    分治算法 最邻近点对 设计与实现查找平面上的最邻近点对问题的算法 解决思路 如果说用暴力的方法来解决这道题 我们需要将所有的点两两进行比较 两层循环的时间复杂度为O n 那么如何降低时间复杂度呢 如果空间中只存在一个点 那么就不存在最近点对
  • Zlib的安装与测试

    官方网址 http www zlib net 进入官网看到 如图所示 最新版本为zlib 1 2 11 然后你用wget http www zlib net zlib 1 2 11或者wget http www zlib net zlib
  • 算法设计与分析考试复习

    冒泡排序 排序思路 1 从第0个元素开始 每次用相邻的两个元素进行比较 2 一旦发现后面的一个元素小于我们前面的一个元素就交换位置 3 经过一轮冒泡排序比较之后最后一个元素就是最大值 4 排除最后一个元素 以此类推 每次比较完成后最大值都会
  • python算法中的深度学习算法之前馈神经网络(详解)

    目录 学习目标 学习内容 前馈神经网络 多层感知机 卷积神经网络
  • python算法中的机器学习算法之无监督学习知识点(详解)

    目录 学习目标 学习内容 K均值聚类 K Means Clustering 层次聚类 Hierarchical Clustering
  • 算法设计与分析 | 一般背包问题

    题目描述 某天KID利用飞行器飞到了一个金银岛上 上面有许多珍贵的金属 KID虽然更喜欢各种宝石的艺术品 可是也不拒绝这样珍贵的金属 但是他只带着一个口袋 口袋至多只能装重量为 W 的物品 岛上金属有 s 个种类 每种金属重量不同 分别为

随机推荐

  • sqli-labs通关全解---有关请求头注入--less18-22--7

    HTTP请求头我们可以通过chrome的F12开发者工具看到 一般的请求头内容如下 1 Accept Accept application json 浏览器可以接受服务器回发的类型为 application json Accept 代表浏览
  • sql字符串拼接

    1 概述 在SQL语句中经常需要进行字符串拼接 以sqlserver oracle mysql三种数据库为例 因为这三种数据库具有代表性 sqlserver select 123 456 oracle select 123 456 from
  • Mac电脑SecureCRT安装步骤

    Securecrt Mac版是Mac os系统上一款强大易用且专业的终端SSH工具 类似于Windows中的Putty SecureCRTpo解版支持SSH1 SSH2 Telnet等远程连接 同时具有很多实用和专业的辅助功能 支持保存mi
  • 01 如何学习Python Web开发从入门到实战

    Python Web开发从入门到实战 前言 Python Web是学校所学的课程 我希望在学习的同时通过写笔记的形式来记录我学习以及由学校学习转而自身对此方向感兴趣的一个过程 更多还是让自己在课程结束之后进行一个小的总结来回顾 提高自己 当
  • C# socket服务端判断 客户端已经断开连接的一个小办法

    具体原理就是 If the remote host shuts down the Socket connection with the Shutdown method and all available data has been rece
  • C语言《数据结构》(朱战立):顺序表与链表

    数据结构 顺序表与链表 线性结构的特点是 除第一个和最后一个元素外 每个元素只有一个前驱数据元素和一个后继数据元素 线性表是一种可以在任意位置进行插入和删除数据元素操作的 由n n 0 个相同类型数据元素a0 a1 a2 an 1组成的线性
  • 区块链正在开启一场回归商业,融合商业的新发展

    对于区块链来讲 它其实同样在延续着这样一种发展路径 正如上文所说 区块链正在开启一场回归商业 融合商业的新发展 而欲要实现这一点 区块链就是要从底层算法 底层数据传输 底层体系的打造着手来实现 更为确切地说 区块链回归商业的路径 其实就是要
  • 测试技术栈整理 -- 测试开发工程师的自我修养

    导航 一 测试理论 二 单元测试 三 集成测试 四 接口测试 五 界面 UI 测试 六 性能测试 七 自动化测试 八 Linux 九 更高级别的测试 十 测试大神好文推荐 一 测试理论 标题 链接 软件的生命周期 https blog cs
  • 因果推断17--基于反事实因果推断的度小满额度模型学习笔记

    目录 一 原文地址 二 一些问题 2 1如何从RCT随机样本过渡到观测样本因果建模 2 2反事实学习的核心思想 2 3度小满的连续反事实额度模型 Mono CFR 2 4Mono CFR代码实现 待补充 2 5CFR学习 2 5 1TarN
  • 密度计算机公式,密度浓度换算公式(浓度和密度的换算关系)

    根据密度 质量除以体积 浓度 物质的量n除以体积 物质的量n等于m除以M 最后得到 密度等于物质的摩尔质量乘以密度 C 1000 d w M C 物质的量的浓度 d 密度 w 质量分数 M 摩尔质量 有多少写多少 里面好象还有升 立方米 反
  • SpringBoot 配置文件中的信息加密

    SpringBoot 配置文件敏感信息加密 说明 打开application properties或application yml 比如 MySql登陆密码 Redis登陆密码以及第三方的密钥等等一览无余 这里介绍一个加解密组件 提高一些属
  • pandas——相关系数函数corr()

    计算DataFrame列之间的相关系数 a np arange 1 10 reshape 3 3 data DataFrame a index a b c columns one two three print data one two t
  • Linux网络接口操作之if_nameindex

    系统信息 操作系统 lsb release ir Distributor ID CentOS Release 6 7 内核版本 uname r 2 6 32 573 26 1 el6 x86 64 gcc版本 gcc version gcc
  • 详解JS中的栈内存与堆内存!(配图解)

    一 栈内存 1 访问顺序 栈是一种先进后出的数据结构 栈内存是内存中用于存放临时变量的一片内存块 它是一种特殊的列表 栈内的元素只能通过列表的一端访问 这一端称为栈顶 另一端称为栈底 2 存储数据 一般来说 栈内存主要用于存储各种基本类型的
  • 【DC系列】DC-1靶场

    首先下载DC1的镜像资源 Index of downloadshttps www five86 com downloads 下载完成后进行解压 鼠标右击DC 1镜像 gt 打开方式 gt 选择虚拟机 如下图所示 输入虚拟机名称和选择虚拟机的
  • pycharm中安装并配置pyinstaller

    1 打开Anaconda Prompt 进入虚拟环境 conda activate TF1 14 2 安装pyinstaller 在anaconda中输入 pip install PyInstaller 3 在pycharm中配置pyins
  • 大数据统计分析毕业设计_大数据时代的成绩管理与数据分析毕业设计论文最新版...

    大数据时代的成绩管理与数据分析毕业设计论文 docx 由会员分享 可免费在线阅读全文 更多与 大数据时代的成绩管理与数据分析毕业设计论文 相关文档资源请在帮帮文库 www woc88 com 数亿文档库存里搜索 1 Threadslee 录
  • Lucas–Kanade光流算法学习

    转自 https www cnblogs com dverdon p 5325498 html Lucas Kanade光流算法是一种两帧差分的光流估计算法 它由Bruce D Lucas 和 Takeo Kanade提出 光流 Optic
  • CTFHub S7协议恶意攻击分析 WP

    一道分析S7Comm协议的流量题 这题经过雪姐姐的指点才得到flag 把流量包通过wireshark进行分析 使用tcp stream eq 0的指令进行一个过滤 分析0流的S7 Communication 在数据包时1321发现了stop
  • 布线问题(分支限界)

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