资源描述:
《迷宫(c语言版)--数据结构课程设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、一.迷宫问题求解1.问题描述迷宫问题是实验心理学的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口出赶迷宫。迷宫中设置了很多隔壁,对前进方向形成了多出障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找路径以到达出口。然而,用计机模拟迷宫问题,即划好迷宫的隔壁的设置,让计算机从入口处进入迷宫探究出一条通路。2.设计思路回溯法是一种不断试探且及时纠正错误的探索方法。下面的求解过程既是使用回溯法。从入口出发,按某一个方向向前探索,若能走通并且未走过,即某处可以到达,则到达新点,否则试探下一个方向;若所有的方向均没有通路,则
2、沿原路返回前一个点,换下一个方向继续探索,直到找到一条通路,或无路可走又返回到入口点。在求解过程中,为了保证在到达某一点后不能向前继续行走(无路)时,能正确返回前一个点以便继续从下一个方向向前试探,则需要用一个栈保存所有到达点的下标。另外,求解该问题的一个重要问题是如何防止回溯时走重复节点,以避免发生死循环。这里,我们采用对走过的结点,修改其结点信息。如在设计之初,我们设置保存迷宫结构的二维数组中0值代表该节点可走,1值代表其不可走,那么我们可以把走过的结点值改为非0,已使其不能被再次探索。3.数据结构设计由上面的设计思路知,若想正确的使用回溯
3、法求解迷宫问题,必须要借助一个栈以保存走过的结点信息。而这里我活用了栈,只把其数据结构抽象为了一个结构体数组,具体设计如下:typedefstruct{intx,y;/*记录迷宫结点的位置信息*/}pos;posPos[100];/*结构体数组以保存走过的结点信息*/4.功能函数介绍(1)判断是否找到出口函数Isover();该函数的参数是当前结点的x、y坐标与出口结点的x、y坐标,通过比较其值来判断是否找到出口结点,从而控制程序结束。(2)对程序相关信息的简单介绍函数introduce();该函数主要是在进行绘制迷宫的图形化界面之前开发者搞的
4、一点小插曲,以介绍跟该程序的相关的部分信息。(3)用回溯法探究迷宫出口函数mazepath();该函数即是利用回溯法探究迷宫问题。函数从接受的起点出发,逐个向其可走方向进行探究,并同时把其所走过的结点的结点信息值改为迷宫现有探索结点中为有效的个数,以避免走重复结点。同时该函数在探索一条有入口到出口的路径的同时,加入了一些图像处理函数,把迷宫的探索的过程动态的显示出来,个人对迷宫探索的思路已较为直观的感觉。(4)主函数main()该函数中处理了图形设备的初始化及迷宫结构的初始化工作,同时在调用上述功能函数完成迷宫探索路径问题的同时,加入了探索完成
5、后的一些图形界面的显示内容。5.编码实现#include#include#include#include#include#include#defineMaxSize8#defineStartPx170#defineStartPy150typedefstruct{intx,y;}pos;posPos[100];intIsover(ints_x,ints_y,inte_x,inte_y){/*判断是否找到出口*/if(s_x==e_
6、x&&s_y==e_y)return1;elsereturn0;}voidmazepath(intm_mazeArray[][MaxSize],ints_x,ints_y,inte_x,inte_y){intcount=0,sum=0;intstr[80];m_mazeArray[s_y][s_x]=-1;Pos[count].x=s_x;Pos[count].y=s_y;while(!Isover(s_x,s_y,e_x,e_y)){if(m_mazeArray[s_y][s_x+1]==0){sum++;m_mazeArray[s_y][+
7、+s_x]=++count;setcolor(GREEN);circle(s_x*30+StartPx+15,s_y*30+StartPy+15,10);setfillstyle(1,YELLOW);floodfill(s_x*30+StartPx+15,s_y*30+StartPy+15,GREEN);sleep(1);Pos[count].x=s_x;Pos[count].y=s_y;}elseif(m_mazeArray[s_y-1][s_x]==0){sum++;m_mazeArray[--s_y][s_x]=++count;setco
8、lor(GREEN);circle(s_x*30+StartPx+15,s_y*30+StartPy+15,10);setfillstyle(1,YE