当前位置:文档之家› 数据结构实验-迷宫问题

数据结构实验-迷宫问题

数据结构实验-迷宫问题
数据结构实验-迷宫问题

实验报告

int j; //当前方块的列号

int di; //di是下一个相邻的可走的方位号

}st[MaxSize];// 定义栈

int top=-1 //初始化栈

三、算法设计

要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。

方向:每一个可通点有4个可尝试的方向,向不同的方向前进时,目的地的坐标不同。预先把4个方向上的位移存在一个数组中。如把上、右、下、左(即顺时针方向)依次编号为0、1、2、3.其增量数组move[4]如图3所示。

move[4] x y

0 -1 0

1 0 1

2 1 0

3 0 -1

图2数组move[4]

方位示意图如下:

通路:通路上的每一个点有3个属性:一个横坐标属性i、一个列坐标属性j和一个方向属性di,表示其下一点的位置。如果约定尝试的顺序为上、右、下、左(即顺时针方向),则每尝试一个方向不通时,di值增1,当d增至4时,表示此位置一定不是通路上的点,从栈中去除。在找到出口时,栈中保存的就是一条迷宫通路。

从前一个方块找到相邻可走方块之后,再从当前方块找在、相邻可走方块,若没有这样的方快,说明当前方块不可能是从入口路径到出口路径的一个方块,则从当前方块回溯到前一个方块,继续从前一个方块找可走的方块。

为了保证试探的可走的相邻方块不是已走路径上的方块,如(i,j)已经进栈,在试探(i+1,j)的下一方块时,又试探道(i,j),这样会很悲剧的引起死循环,为此,在一个方块进栈后,将对应的mg数组元素的值改为-1(变为不可走的相邻方块),当退栈时(表示该方块没有相邻的可走方块),将其值恢复0,其算法代码和相应的解释如下:find=0;

while (di<4 && find==0) //找下一个可走方块

{

di++;

switch(di)

{

case 0:i=st[top].i-1;j=st[top].j;break;

case 1:i=st[top].i;j=st[top].j+1;break;

case 2:i=st[top].i+1;j=st[top].j;break;

case 3:i=st[top].i,j=st[top].j-1;break;

}

if (mg[i][j]==0) find=1;//找到下一个可走相邻方块

}

if (find==1) //找到了下一个可走方块

{

st[top].di=di; //修改原栈顶元素的di值

top++; //下一个可走方块进栈

st[top].i=i;st[top].j=j;st[top].di=-1;

mg[i][j]=-1; //避免重复走到该方块

}

else //没有路径可走,则退栈

{

mg[st[top].i][st[top].j]=0;//让该位置变为其他路径可走方块

top--; //将该方块退栈

}

}

return(0); //表示没有可走路径,返回0

(2)求解主程序

建立主函数调用上面的算法,将mg和st栈指针定义为全局变量void main()

{

mgpath(1,1,M,N);

四、界面设计

设计很简单的界面,输出路径。

五、运行测试与分析

图5.基本运行结果

六、实验收获与思考

思考:8个方向的问题

1.设计思想

(1)设置一个迷宫节点的数据结构。

(2)建立迷宫图形。

(3)对迷宫进行处理找出一条从入口点到出口点的路径。

[i],[j+dy]。于是搜索方向的变化只要令方向值dir从0增至7,便可以从move数组中得到从[i],[j]点出发搜索到的每一个相邻点[x],[y]。

x=i+move[dir].dx

y=j+move[dir].dy

图7 方向位移图图8向量差图

为了防止重走原路,我们规定对已经走过的位置,将原值为0改为-1,这既可以区别该位置是否已经走到过,又可以与边界值1相区别。当整个搜索过程结束后可以将所有的-1改回到0,从而恢复迷宫原样。

这样计算机走迷宫的方法是:采取一步一步试探的方法。每一步都从(E)开始,按顺时针对8个方向进行探测,若某个方位上的maze[x],[y]=0,表示可以通行,则走一步;若maze[x],[y]=1,表示此方向不可通行须换方向再试。直至8个方向都试过,maze[x],[y]均为1,说明此步已无路可走,需退回一步,在上一步的下一个方向重新开始探测。为此需要设置一个栈,用来记录所走过的位置和方向(i,j,dir)。

当退回一步时,就从栈中退出一个元素,以便在上一个位置的下一个方向上探测,如又找到一个行进方向,则把当前位置和新的方向重新进栈,并走到新的位置。如果探测到x=m,y=n,则已经到达迷宫的出口,可以停止检测,输出存在栈中的路径;若在某一位置的8个方向上都堵塞,则退回一步,继续探测,如果已经退到迷宫的入口(栈中无元素),则表示此迷宫无路径可通行。

2系统算法(伪代码描述):

inimove(move); //初始化方向位移数组

path(maze,move,s); //寻找迷宫通路

cout<

draw(maze,s); //绘制作出通路标记的迷宫

}

5.运行结果

收获: 这次试验总体来说还是比较简单的,因为几个思考问题都是在基本问题的源代

码上进行改进和补充。有了第一次数据结构编程和测试的经验,这次试验减少了很多困难,相对来说容易多了。这次实验让我对栈和队列有了更好的理解和运用。

教师评分:

教师签字:

相关主题
文本预览
相关文档 最新文档