C#数据结构课程设计用栈求解迷宫问题_第1页
C#数据结构课程设计用栈求解迷宫问题_第2页
C#数据结构课程设计用栈求解迷宫问题_第3页
C#数据结构课程设计用栈求解迷宫问题_第4页
C#数据结构课程设计用栈求解迷宫问题_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、 数据结构c#课程设计题 目 用栈求解迷宫问题 班 级 组长姓名学号 组员姓名学号 组员姓名学号 组员姓名学号 指导教师 编写日期 目录摘要2第1节课程设计题目2第2节课程设计内容22.1需求分析22.2实验目的32.3实验要求3第3节求解迷宫过程其原理4第4节课程设计实验步骤5第5节项目测试65.1测试过程出现的错误以及原因65.2测试数据截图7第6节项目代码9第7节课程设计实验小结20摘要数据结构课程设计是学习数据结构课程的一个重要环节。能巩固和加深课堂教学内容,提高学生实际工作能力,培养科学作风,为学习后续课程和今后的系统开发奠定基础。通过课程设计,使学生熟练掌握数据结构课程中所学的理论

2、知识,并实际应用,通过综合运用数据结构的基本知识来解决实际问题,加强学生分析和解决问题的能力。课程设计比教学实验更复杂一些,深度更广并更加接近实际应用。通过课程设计的综合训练,培养我们学生实际分析问题、编程和动手能力,最终帮助我们学生系统把握课程的主要内容,更好地完成教学任务。第1节 课程设计题目题目:用栈求解迷宫问题第2节 课程设计内容2.1 需求分析迷宫问题通常是用“穷举求解”方法解决,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前走;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。栈是一个后进先

3、出的结构,可以用来保存从入口到当前位置的路径。 定义迷宫类型来存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。为处理方便起见,在迷宫的四周加一圈障碍2.2 实验目的()了解回溯法在求解迷宫问题中的应用。()进一步了解栈的应用2.3 实验要求 设计一个项目求解迷宫问题的所有路径。要求如下:(1) 迷宫最外围一圈都是不可走的(2) 从一个方块出发一步只能走其相邻的上、下、左、右4个方块中的一个可走方块。(3) 根据用户要求设置一个m*n的迷宫(m、n=10)以及迷宫的入口和出口。(4) 提供“找路径”命令按钮,通过单击显示第一条迷宫路径。(5) 提供“找下一条路径”命令按

4、钮,单击它一次显示一下条迷宫路径,直到所有的迷宫路径显示完毕。(6) 如下图所示是用户设置一个8*8的迷宫,入口为(1,1),出口为(5,5),单击“找回路”命令按钮显示第一条迷宫路径,当单击“找下一条路径”命令按钮显示 第二条迷宫路径,如此操作直到显示出所有的迷宫路径。第3节 求解迷宫过程其原理求解迷宫(xi,yi)到(xe,ye)路径的过程是:先将入口进栈(其初始方位设置为-1),在栈不空时循环:取栈顶方块(不退栈),若该方块是出口,则输出栈中所有方块即为路径。否则,找下一个可走的相邻方块,若不存在这样的方块,说明当前路径不可能走通,则回溯,也就是恢复当前方块为0后退栈。若存在这样的方块,

5、则将其方位保存到栈顶元素中,并将这个可走的相邻方块进栈(其初始方位设置为-1)。第4节 课程设计实验步骤(1)新建一个windows应用项目“迷宫_栈”。(2)设计本项目对应的窗体form1,其设计界面如下图所示。窗体上首先显示的是一个默认的10*10迷宫图(每个方块用一个命令按钮表示,白色表示可走,蓝色表示不可走),其操作步骤如下:用户输入行数m和列数n(m、n取值在410之间,包含4和10),单击“设置行列确定”吗,命令按钮,迷宫根据用户输入变成一个m*n迷宫图。用户可以点击迷宫图中的方块命令按钮改变其颜色,定制完成后单击“设置迷宫确定”命令按钮。用户设置入口和出口方块位置。单击“找路径”

6、命令按钮,如果存在迷宫路径,则在迷宫图中显示第一条迷宫路径,迷宫路径用浅黄色方块标记,“”表示方块入口,“”表示方块出口,迷宫路径上的方块箭头表示路径走向。如果要下一条迷宫路径,单击“找下一跳路径”命令按钮,如果存在下一条迷宫路径,则在迷宫图中显示该迷宫路径,如果照完了所有迷宫路径,则显示相应的提示信息。第5节 项目测试5.1 测试过程出现的错误以及原因(1)调试过程中出现的错误有编译连接时的一些语法错误,也有由于算法存在问题而导致程序运行没有结果或者不是预期的结果。这里主要说一下自己由于算法而导致的错误:因为没有注意结点不能重复走,所以造成了死循环,程序没有结果。通过分析后把走过的结点变为不

7、可走的结点,这样就避免了重复走到该结点。还有就是判断迷宫是否有通路的这个结果不能如预期的结果那样:有通路就输出所有的通路,没有就输出“未找到迷宫路径”。因为没有通路可走的时候栈是空的,但是输出所有的路径以后栈也是空的。当迷宫有通路的时候,在输出所有路径以后还是会输出“未找到迷宫路径”这句话。当迷宫没有通路的时候,输出“未找到迷宫路径”这句话。因为算法的思想是这样的,所以达不到预期的结果。解决的方法是如果迷宫有通路则输出所有的通路,如果迷宫没有通路,则没有结果输出。(2)迷宫的求解一般采用的是“穷举求解”,利用栈的思想,先将入口位置进栈,判断方向,若其方向可通,则进栈,若不通,则出栈,如此循环下

8、去。5.2 测试数据截图第6节 项目代码using system;using system.collections.generic;using system.componentmodel;using system.data;using system.drawing;using system.text;using system.windows.forms;namespace maze2 public partial class form1 : form const int m = 10; const int n = 10; const int maxsize = 100; struct box

9、/定义方块结构体类型 public int i;/当前方块的行号 public int j;/当前方块的列号 public int di;/di是下一可走相邻方位的方位号 ; struct sttype /定义顺序栈结构体类型 public box data; public int top;/栈顶指针 ; sttype st = new sttype();/定义栈st int xi, yi, xe, ye; /迷宫的入口和出口 int count = 1; /路径计数 public button, mg = new buttonm, n; public int m=m,n=n; int, a

10、= 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,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, eventar

11、gs e) int i, j; int x = 40, y = 120; /(x,y)为每个方块左上角坐标 size s = new size(30, 30); for (i = 0; i m; i+) for (j = 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; pri

12、vate void button_click(object sender, eventargs e) button btn=(button)sender; if (btn.backcolor = system.drawing.color.blue) btn.backcolor = system.drawing.color.white; else btn.backcolor = system.drawing.color.blue; private void button1_click(object sender, eventargs e) int i,j; try if (textbox1.te

13、xt.tostring() != ) m = int.parse(textbox1.text.tostring(); else m = m; if (textbox2.text.tostring() != ) n = int.parse(textbox2.text.tostring(); else n = n; catch (exception err) infolabel.text = 操作提示:输入的迷宫大小是错误的,需重新输入; return; if (m 10 | n 10) infolabel.text = 迷宫行数或列数输入错误,请重置; return; for (i = 0; i

14、 m; i+) for (j = n; j n; j+) mgi, j.visible = false; for (i=m;im;i+) for (j=0;jn;j+) mgi, j.visible = false; for (i = 0; i m; i+) mgi, n - 1.backcolor = system.drawing.color.blue; for (j = 0; j n; j+) mgm - 1, j.backcolor = system.drawing.color.blue; button1.enabled = false; button2.enabled = true;

15、private void button2_click(object sender, eventargs e) int i, j; textbox3.text = 1; textbox4.text = 1; textbox5.text = convert.tostring(m - 2); textbox6.text = convert.tostring(n - 2); for (i = 0; i m; i+) for (j = 0; j (xe,ye) int i, j, di, find; st.data = new boxmaxsize; st.top = -1;/初始化栈顶指针 st.to

16、p+;/初始方块进栈 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 (i = xe & j = ye)/找到了出口,输出路径 return true;/找到一条路径后返回true find = 0; while (di -1)/栈不空时循环 i = st.datast.top.i; j

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

18、= st.datast.top.i + 1; j = st.datast.top.j; break; case 3: i = st.datast.top.i; j = st.datast.top.j - 1; 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

19、= -1; /避免重复走到该方块 else/没有路径可走,则退栈 ast.datast.top.i, st.datast.top.j = 0; /让该位置变为其他路径可走方块 st.top-;/将该方块退栈 return false;/表示没有可走路径,返回false private void display() /显示一条迷宫路径 int i; for (i = 0; i = st.top; i+) mgst.datai.i, st.datai.j.backcolor = system.drawing.color.antiquewhite; switch (st.datai.di) case

20、 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 void restore() /清除上一条迷宫路径 int i; for (i = 0; i = st.top; i+) mgst.datai.

温馨提示

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

评论

0/150

提交评论