6-4布线问题(分支限界)

news2024/9/24 3:29:54

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
*/

有最短路
在这里插入图片描述

没有最短路
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言第十二课(下):操作符详解【逗号表达式、下标引用、函数调用、结构成员操作符与操作符属性】

目录 前言&#xff1a; 一、逗号表达式&#xff08;exp1&#xff0c;exp2&#xff0c;exp3&#xff0c;...&#xff0c;expN&#xff09;&#xff1a; 二、下标引用、函数调用和结构成员[ ]、( )、. 、->&#xff1a; 1.下标引用操作符[ ]&#xff1a; 2.函数调用操作符( …

Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知

Tomcat 不但没有过时&#xff0c;Spring Boot 还给 Tomcat 第二春了。 微服务的兴起&#xff0c;Tomcat 针对很多应用已经做成 embedded 模式了&#xff0c;Tomcat 本身是容器&#xff0c;Tomcat 的出现就是为了解决但是 EJB 和 Weblogic&#xff0c;JBoss 这种大而全的大象导致…

C++ OpenCV【视频合并:多个图像拼接在一张图像】

提示&#xff1a;本文中视频拼接指的是将多张图像按空间合并在一张图像上&#xff0c;而不是将多张图像按时间顺序拼接成一个多帧片段。 文章目录 前言 一、OpenCV知识点 1.OpenCV裁剪矩形区域赋值 2.OpenCV将Mat粘贴到指定位置 二、程序样例 1.程序源码 2.运行结果 前言 C版…

[附源码]Python计算机毕业设计Django姜太公渔具销售系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

看完这篇,还不懂JAVA内存模型(JMM)算我输

前言 开篇一个例子&#xff0c;我看看都有谁会&#xff1f;如果不会的&#xff0c;或者不知道原理的&#xff0c;还是老老实实看完这篇文章吧。 Slf4j(topic "c.VolatileTest") public class VolatileTest {static boolean run true;public static void main(Str…

一个简单的HTML网页 个人网站设计与实现 HTML+CSS+JavaScript自适应个人相册展示留言博客模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Ubtunu排查磁盘空间是否已满—并清理的方式

项目场景&#xff1a; 最近使用nodejs开发的后端项目部署到Ubtunu服务器后接口无法访问了&#xff0c;接口也调用不通&#xff0c;NGINX报502错误。 问题描述 使用远程连接工具传文件也是无法上传&#xff0c;提示找不到文件&#xff0c;SCP命令也无法上传。 scp传文件报错&…

一文教会你如何在内网搭建一套属于自己小组的在线 API 文档?

Hello&#xff0c;大家好&#xff0c;我是阿粉&#xff0c;对接文档是每个开发人员不可避免都要写的&#xff0c;友好的文档可以大大的提升工作效率。 阿粉最近将项目的文档基于 Gitbook 和 Gitlab 的 Webhook 功能的在内网部署了一套实时的&#xff0c;使用起来特方便了。跟着…

第二证券|11月十大牛股出炉 特一药业163%涨幅问鼎榜首

到11月30日收盘&#xff0c;11月份十大牛股中7只个股涨幅超过100%&#xff0c;涨幅最小的也有87%&#xff0c;均匀涨幅较上个月有所扩大。 11月&#xff0c;A股出现震荡爬高态势&#xff0c;到11月30日收盘&#xff0c;上证指数月内涨8.91%&#xff0c;深证成指涨6.84%&#xf…

大学生HTML作业节日网页 HTML作业节日文化网页期末作业 html+css+js节日网页 HTML学生节日介绍 HTML学生作业网页视频

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于STM32单片机的温湿度检测报警器(数码管)(Proteus仿真+程序)

编号&#xff1a;27 基于STM32单片机的温湿度检测报警器&#xff08;数码管&#xff09; 功能描述&#xff1a; 本设计由STM32F103单片机最小系统DHT11温湿度传感器数码管显示模块声光报警模块独立按键组成。 1、主控制器是STM32F103单片机 2、DHT11传感器测量温度和湿度数据…

Android注解快速入门和实用解析

首先什么是注解&#xff1f;Override就是注解&#xff0c;它的作用是&#xff1a; 1、检查是否正确的重写了父类中的方法。2、标明代码&#xff0c;这是一个重写的方法。1、体现在于&#xff1a;检查子类重写的方法名与参数类型是否正确&#xff1b;检查方法private&#xff0f…

带你走进知识图谱的世界

知识图谱知识图谱的介绍01 什么是知识图谱02 知识图谱构建的关键技术03 知识图谱的存储04 知识图谱在金融领域的应用图数据库 Neo4j知识图谱的介绍 知识图谱最开始是Google为了优化搜索引擎提出来的&#xff0c;推出之后引起了业界轰动&#xff0c;随后其他搜索公司也纷纷推出…

[附源码]计算机毕业设计医疗器械公司公告管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MXNet中im2rec将图片转换成二进制RecordIO格式

我们在前面的 计算机视觉之目标检测训练数据集&#xff08;皮卡丘&#xff09;《2》其中有提到这个二进制的RecordIO格式&#xff0c;使用的是MXNet自带的im2rec工具&#xff0c;源码在tools里面 import mxnet as mx #D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\…

农大毕业7年后,转行软件测试,我拿到了一块结实的敲门砖

“经过这段时间的学习&#xff0c;让我摸清了这个行业的游戏规则&#xff0c;可以说是让我拿到了一块结实的敲门砖。” 今天跟大家分享的是近期就业的学员刘同学的转行故事&#xff0c;希望他的经历能给同样在向梦想奔跑的你一些帮助。 毕业7年后&#xff0c;从网信办主任转行…

基于STM32单片机的直流电机PWM调速(数码管显示)(Proteus仿真+程序)

编号&#xff1a;24 基于STM32单片机的直流电机PWM调速 功能描述&#xff1a; 由 STM32单片机数码管显示模块键盘模块L298N电机驱动模块直流电机 1、采用STM32F103单片机为主控制器 2、四个按键&#xff0c;分别为启动/暂停、方向切换、加速、减速功能 3、数码管显示PWM占空比…

[附源码]计算机毕业设计演唱会门票售卖系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SMART PLC高速脉冲输出如何断电保持当前位置

S7-200 SMART PLC脉冲轴控制相关的内容,可以参看下面的博客: S7-200 SMART PLC自定义脉冲轴控功能块AxisControl_FB(梯形图)_RXXW_Dor的博客-CSDN博客博途1200/1500PLC的相关总线轴PN总线控制可以参考相关专栏的博客,链接地址如下:博途PLC 1200/1500PLC轴控功能块Servo_A…

[附源码]Python计算机毕业设计Django基于Vuejs的中国名茶销售平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…