寻找迷宫路径

寻找迷宫路径其实就是遍历每一个可能的路径,碰到能够成功的路径就返回。

bool findPath()
{//寻找一条从入口(1,1)到达出口(size,size)的路径
//如果找到,返回true,否则返回false
path=new arrayStack<position>;
//初始化偏移量
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;//上
//初始化迷宫外围的障碍墙
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=1;
here.col=1;
maze[1][1]=1;//防止回到入口
int option=0;//下一步
int 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)
{移动maze[r][c]
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.row-here.row;//向左或者向右
here=next;

}

}
return true;
}

我们来理一下程序的思路,前面的造墙和方向偏移就不说了,主要说找路径的核心代码,首先从入口开始走,有上下左右四个方向,然后开始对四个方向进行遍历,发现第0个方向即右不通于是走下,通了然后将之前的位置设置为墙防止走回来,然后继续选择右行,不行在opetion++下行,然后将之前的地方设置为1,反之走回来,然后继续,发现option用完了,都走不通,于是删除path最顶上的那个点,回退到上一个点,并接着之前的方向进行遍历,发现往左能走,于是走到左并将之前的点置一(虽然已经是1了),发现还是走不通,于是在回退,继续遍历,发现还是走不通,在退一格,在继续遍历,然后继续走,能走就走,不能走就回退。总能找到一条路。
以上全部为我yy的,为了让程序更容易理解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值