嘉兴学院数据结构C课程设计资料_第1页
嘉兴学院数据结构C课程设计资料_第2页
嘉兴学院数据结构C课程设计资料_第3页
嘉兴学院数据结构C课程设计资料_第4页
嘉兴学院数据结构C课程设计资料_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一问题描述1二问题分析1三数据结构描述 .1四算法设计1五主程序代码 .4六程序运行结果14七实验小结151.问题描述:给定一个 M*N 的迷宫图,求一条从指定入口到出口的路径。假设迷宫图如图M=10 ,N=1 ,其中的方块图表示迷宫。对于途中的每个方块,用空格表示通道,用阴影表示墙。要求所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。2.问题分析:为了表示迷宫,设置一个数组a,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块不可走。数据结构描述:在算法中用到的栈采用顺序栈存储结构,将栈定义如下:Struct BoxPublic int i;Pu

2、blic int j;Public int di;Struct StTypePublic Box data;Public int top;StType st=new StType();算法设计:求迷宫问题就是在一个指定的迷宫中求出入口到出口的路径。求解时,通常用的是 “穷举求解”的方法。即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直到所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。对于迷宫中的每个方块,有上、下、左、右4个方块相邻,第 i 行第 j 列的方块的位置

3、记为( i , j ),规定上方方块为方位0,并按顺时针方向递增编号。在试探过程中,假设从方位0到方位 3的方向查找下一个可走的方块。为了便于回溯 , 对于可走的方块都要进栈, 并试探它的下一可走的方位, 将这个可走的方位保存到栈中。求解迷宫( xi , yi )到( xe, ye)路径的过程是:先将入口进栈,在栈不空时循环:取栈顶方块(不退栈),若该方块是出口,则输出栈中所有方块即为路径。否则,找下一个可走的相邻方块,若不存在这样的方块, 说明当前路径不可能走通,则回溯,也就是恢复当前方块为 0后退栈。若存在这样的方块,则将其方位保存到栈顶元素中,并将这个可走的相邻方块进栈(其初始方位设置为

4、 -1 )。求迷宫路径的回溯过程中,从前一方块找到一个可走相邻方块即当前方块后,再从当前方块找相邻可走方块,若没有这样的方块,说明当前方块不可能是从入口到出口路径上的一个方块,则从当前方块回溯到前一方块,继续从前一方块找另一个可走的相邻方块。为了保证试探的可走相邻方块不是已走路径上的方块,如(i ,j )已进栈,在试探(i+1 ,j )的下一可走方块时,又试探到(i ,j ),这样可能会引起死循环。为此,在一个方块进栈后,将对应的a数组元素值改为-1 (变为不可走的相邻方块),当退栈时(表示该栈顶方块没有可走相邻方块),将其恢复为0。求解一条从入口(xi , yi )到出口( xe, ye)的

5、迷宫路径的算法如下:Public bool mgpath(int xi,int yi,int xe,int ye)Int I,j,k,di,find;st.data=new BoxMaxSize;st.top=-1;/ 初始化栈顶指针st.top+;/初始入口方块进栈st.datast.top.i=xi;st.datast.top.j=yi;st.datast.top.di=-1;axi,yi=-1;while (st.top -1)/ 栈不空时循环i = st.datast.top.i;j = st.datast.top.j;di = st.datast.top.di;/ 取栈顶方块if (

6、i = xe & j = ye)/ 找到了出口, 输出路径return true;/ 找到一条路径后返回truefind = 0;while (di 4 & find= 0)/ 找到下一个可走方块di+;switch(di)case 0: i = st.datast.top.i - 1; j = st.datast.top.j;case 1: i = st.datast.top.i; j = st.datast.top.j + 1;case 2: i = st.datast.top.i + 1; j = st.datast.top.j;case 3: i = st.datast.top.i;

7、j = st.datast.top.j - 1;break;break;break;break;if (ai, j = 0) find = 1;/ 找到下一个可走相邻方块if (find = 1)/找到了下一个可走方块st.datast.top.di = di;/ 修改原栈顶元素的di值st.top+;st.datast.top.i = i;st.datast.top.j = j;st.datast.top.di = -1;/ 下一个可走方块进栈ai, j = -1;/ 避免重复走到该方块else/没有路径可走,则退栈ast.datast.top.i, st.datast.top.j = 0;

8、/让该位置变为其他路径可走方案st.top-;/将该方块退栈return false;/ 表示没有可走路径,返回false当采用上述过程找到出口时,栈中从栈底到栈顶恰好是一条从入口到出口的迷宫路径,输出栈底到栈顶的所有方块即为一条从入口到出口的迷宫路径。5.主程序代码:using System;using System.Drawing;using System.Windows.Forms;namespace 用栈求迷宫public partial classForm1 : Formconst int M = 10;const int N = 10;const int MaxSize = 100

9、;struct Boxpublic int i;public int j;public int di;struct StTypepublic Box data;public int top;StType st = new StType();int xi, yi, xe, ye;int count = 1;public Button , mg = new Button M, N;public int m = M, n = N;int, a = new int ,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,0,0,1,0,1,1,0,0,0,

10、0,1,1,0,0,1,1,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,;public Form1()InitializeComponent();private void Form1_Load( object sender, EventArgs e)int i, j;int x = 40, y =120;Size s = new Size(30,30);for (i = 0; i M; i+)for (j

11、 = 0; j = 40 + M * 30)x = 40;y += 30;textBox1.Text = Convert.ToString(M);textBox2.Text = Convert.ToString(N);button2.Enabled = false;button3.Enabled = false;button4.Enabled = false;private void button_Click( object sender, EventArgs e)Button btn =( Button )sender;if (btn.BackColor = System.Drawing.

12、Color .Blue)btn.BackColor = System.Drawing. Color .White;elsebtn.BackColor = System.Drawing. Color .Blue;private void button1_Click( object sender, EventArgs e)int i, j;tryif (textBox1.Text.ToString() != )m = int .Parse(textBox1.Text.ToString();elsem = M;if (textBox2.Text.ToString() != )n = int.Pars

13、e(textBox2.Text.ToString();elsen = N;catch (Exception err )infolabel.Text = 操作提示:输入的迷宫大小是错误的,需要重新输入;return;if (m10 | n10)infolabel.Text = 迷宫行数或列数输入错误,请重新输入 ; return;for (i = 0; i M; i+)for (j = n; j N; j+)mgi, j.Visible =false;for (i = m; i M; i+)for (j = 0; j N; j+)mgi, j.Visible =false;for (i = 0;

14、 i m; i+)mgi, n - 1.BackColor = System.Drawing.for (j = 0; j n; j+)mgm - 1, j.BackColor = System.Drawing.button1.Enabled = false;button2.Enabled = true ;Color .Blue;Color .Blue;private void button2_Click( object sender, EventArgs e)int i, j;textBox3.Text = 1 ;textBox4.Text = 1 ;textBox5.Text = Conve

15、rt.ToString(m-2);textBox6.Text = Convert.ToString(n-2);for (i = 0; i m; i+)for (j = 0; j -1)i = st.datast.top.i;j = st.datast.top.j;di = st.datast.top.di;if (i = xe & j = ye)return true;find = 0;while (di -1)i = st.datast.top.i;j = st.datast.top.j ;di = st.datast.top.di;if (i = xe & j = ye)return tr

16、ue;find = 0;while (di 4 & find = 0)di+;switch(di)case 0: i = st.datast.top.i - 1; j = st.datast.top.j;case 1: i = st.datast.top.i; j = st.datast.top.j + 1;case 2: i = st.datast.top.i + 1; j = st.datast.top.j;case 3: i = st.datast.top.i; j = st.datast.top.j - 1;break;break;break;break;if(ai, j = 0) f

17、ind = 1;if (find = 1)st.datast.top.di = di;st.top+;st.datast.top.i = i;st.datast.top.j = j;st.datast.top.di = -1;ai, j = -1;elseast.datast.top.i, st.datast.top.j = 0;st.top-;return false;private void display()int i;for (i = 0; i = st.top;i+ )mgst.datai.i, st.datai.j.BackColor =System.Drawing. Color

18、.AntiqueWhite;switch (st.data i.di )case 0: mgst.datai.i, st.datai.j.Text = ;break;case 1: mgst.datai.i, st.datai.j.Text = ; break;case 2: mgst.datai.i, st.datai.j.Text = ;break;case 3: mgst.datai.i, st.datai.j.Text = ; break;mgxi, yi.Text = 入口 ;mgxe, ye.Text =出口 ;infolabel.Text =成功找到第 + count.ToString() + 条迷宫路径 ;count + ;private voidrestore()int i;for (i = 0; i = st.top;i+ )mgst.datai.i, st.datai.j.BackColor = System.Drawing.mgst.datai.i, st.datai.j.Text = ;Color .White;mgxe, ye.Text =出口 ;程序运行结果:实验小结:在这为期一个星期的时间内,通过我

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论