在从入口到出口的过程中程序对当前点的上、下、左、右四个点依次进行判断,当发现任一个方向是未走过的区域时,就将当前点指向那个点进行尝试,同时将当前点入栈并做标记。而当4个方向都不通或已走过时,则为死路,标记当前点为死路并从栈中弹出上一个点继续进行尝试,这时因为当前点已被标记为死路,则弹出上一个点时就不会重复这条路,达到寻找正确路径的效果。
go函数的具体实现如下,其实挺简单的^_^:
void cgomaze::go()
{
cpointstack pspath;//保存路径的栈
point ptcur = m_ptin, ptnext;//设置当前点为入口
while(ptcur.x != m_ptout.x || ptcur.y != m_ptout.y)//判断是否已经走出
{
ptnext = ptcur;//设置目标点为当前点,便于下面偏移
if(m_btarrmaze[ptcur.y - 1][ptcur.x] == 0)
ptnext.y --;//如果上方是空的,则目标点向上偏移
else if(m_btarrmaze[ptcur.y][ptcur.x - 1] == 0)
ptnext.x --;//如果左边是空的,则目标点向左偏移
else if(m_btarrmaze[ptcur.y + 1][ptcur.x] == 0)
ptnext.y ++;//如果下方是空的,则目标点向下偏移
else if(m_btarrmaze[ptcur.y][ptcur.x + 1] == 0)
ptnext.x ++;//如果右边是空的,则目标点向右偏移
else
{//这里是没有路的状态
m_btarrmaze[ptcur.y][ptcur.x] = 3;//标记为死路
pspath.pop(ptcur);//弹出上一次的点
continue;//继续循环
}
//如果有路的话会执行到这里
m_btarrmaze[ptcur.y][ptcur.x] = 2;//标记当前点为路径上的点
pspath.push(ptcur);//当前点压入栈中
ptcur = ptnext;//移动当前点
}
}
其实这个部分可以将栈设置为cgomaze类的成员,然后在go函数里加上:
pspath.clearstack();
这样就可以用timer来演示走迷宫的过程了
程序在windows2000sp4,vc6.0环境下通过
完整代码的其余部分因为使用了mfc的向导,比较复杂,没有列出,需要的请e-mail至:conan@5ivb.net
但是我个人认为应该没有必要了,呵呵,算法了解了,这个程序没有别的什么值得看的了^_^
累啦~不知道这东西对初学者有没有帮助,随便写写~hoho