问题简述:
在一个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);//删除当前扩展结点,获取下一个结点
}
}