迷宫寻址问题

本文介绍了迷宫寻径问题的解决思路,包括在矩形迷宫边界添加虚拟墙避免边界处理,使用bool二维数组表示迷宫状态,通过栈记录路径,并通过不同方向变量处理行走选择,探讨了如何在遇到障碍时进行回溯尝试其他路径。
摘要由CSDN通过智能技术生成

思路:

(1)首先为了解决边界问题在一个矩形迷宫的四周围上“一堵墙”,然后不能走,这样就不用特殊处理边界问题了:

(2)对迷宫的各个元素可以用一个bool型的二维数组表示,这样可以减少占用的内存空间,0表示可以走,1表示不可以走;

(3)对每一个迷宫位置表示为(i,j),对应的矩阵表示为maze[i][j];

(4)每个位置相邻有四个方向,每次要选择一个可以走得通没有障碍物的方向行走。所以需要建立一个表示不同方向的变量,且不同方向对矩阵行列的偏移量不同:

(5)每次走过的位置要入栈,然后当走不通时,如果没到达出口,就从一个一个退栈重新选择方向

bool findpath()

{

path=new arraystack<position>;

position offset[4];//定义不同走向时的偏移量

offset[0].row=0;offset[o].col=1;//右

offset[1].row=1;offset[o].col=0;//下

offset[2].row=0;offset[o].col=-1;//左

offset[3].row=-1;offset[o].col=0;//上

//初始化外围的墙

for(int i=0;i<=size+1;i++)

{

maze[0][i]=maze[size+1][i]=1;

maze[i][0]=maze[i][size+1]=1;

}

position here;//当前位置,初始化为入口

here.row=here.col=1;

maze[1][1]=1;

//定义变量表示四中不同走向

int option=0,lastoption=3;

//开始寻址

while(here.row!=size||here.col!=size)

{

    int r,c;

while(option<=lastoption)//下一步的走向

{

r=here.row+offset[option].row;//下一步的行数
c=here.col+offset[option].col;//下一步的列数

if(maze[r][c]==0)break;//如果此次选择的方向下一个位置通,则结束循环,否则继续改变方向寻找能走通的方向

option++;

}

if(option<=lastoption)//当能找到通的下一路位置

{

//把当前位置移入路径栈中

path.push(here);

here.row=r;

here.col=c;

maze[r][c]=1;//此位置已走标记为阻塞

option=0;

}

else//当此位置四个方向都走不通时,把这个位置退栈,从前一位置改变方向找出路

{

if(path->empty())

return false;//无路可退

position next=path.top();

path.pop();

if(next.row=here.row)

option=2+next.col-here.col;

else option=3+next.ro-here.row;
here=next;

}

}

return true;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值