【分支限界法】之布线问题

问题简述

在一个n*m的方格中,这个方格中存在不可走的格子,寻找两个格子的最短距离

问题分析

每个方格可以扩展四个方向的结点,解空间是一颗4叉树

剪枝函数:当前扩展点已经被扩展或者到达了边界(边界包括方格边界和不可布线的格子) ,停止扩展

每向一个方向扩展一次,当前扩展位置nbr的值为扩展点here的值加一

问题采用队列式分支限界法

执行过程

代码:

void FindPath(){
	//设置方格的围墙,n乘m的方格 
	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[0].col = 0;//下 
	offset[2].row = 0;offset[0].col = -1;//左 
	offset[3].row = -1;offset[0].col = 0;//上 
	int NumOfNbrs = 4;//相邻方格数
	Queue Q; 
	Position here,nbr;
	here.row = start.row;here.col = start.col 
	grip[start.row][start.col] = 2;//起点 
	do{
		for(int i=0;i<NumOfNbrs;i++){//向右下左上四个方向扩展 
			nbr.row=here.row+offset[i].row;
			nbr.col=here.col+offser[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)){//找到最终结点,跳出当前for循环 
					break;
				}
				Q.add(nbr);//未找到最终结点,加入队列,继续寻找 
			}
		}
		if((nbr.row == finish.row)&&(nbr.col == finish.col)){//找到最终结点,跳出当前while循环 
			break; 
		}
		if(Q.IsEmpty()){//队列为空,找不到路线 
			return false;
		}
		Q.Delete(here);//删除当前扩展结点,获取下一个结点 
	} 
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝卜脆不脆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值