上学时没学过数据结构和算法,于是现在有机会就自学。下面是我最近在等待进入项目组期间,花了1小时学习了一下迷宫问题。下面是我学习时找到的一篇课程设计的报告,然后自己先看懂,然后又在VC6.0下运行了。

迷宫问题

一.需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。

二.概要设计:

存储结构:

采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。

/*八个方向的数组表示形式*/

int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1, 0},{-1, 1}};

/*用结构体表示位置*/

struct position

{

int x,y;

};

position stack[m*m+1];

基本算法:

走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。

每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。

用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。

二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。

假设当前所在位置是(x,y)。沿某个方向前进一步,它可能到达的位置最多有8个。

如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定:

x=x+move[i][0]

y=y+move[i][1]

从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。在搜索过程中,每前进一步,在所到位置处做标记“”(表示这个位置在通路上),并将该位置的坐标压入栈中。每次后退的时候,先将当前所在位置处的通路标记“”改成死路标记“×”(表示这个位置曾到达过但走不通,以后不要重复进入),然后将该位置的坐标从栈顶弹出。搜索到出口位置时,数组中那些值为“”的元素形成一条通路。

三.详细设计:

源程序:

/*
迷宫问题
走迷宫的过程可以模拟为一个搜索的过程:每到一
处,总让它按东、东南、南、西南、西、西北、北、东北
个方向顺序试探下一个位置;如果某方向可以通过,并且不
曾到达,则前进一步,在新位置上继续进行搜索;如果个
方向都走不通或曾经到达过,则退回一步,在原来的位置上
继续试探下一位置。
每前进或后退一步,都要进行判断:若前进到了出
口处,则说明找到了一条通路;若退回到了入口处,则说明
不存在通路。
用一个字符类型的二维数组表示迷宫,数组中每个元素
取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在
位置(1,1)处,出口点在位置(m,m)处。这个算法,为
其寻找一条从入口点到出口点的通路。
*/
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int m=1;
while (m!=0)
{
#if 0
/* 数组不支持动态的定义 */
printf("输入m,使得为m*m的方阵迷宫(m>0 输入0 时退出:)\n");
scanf ("%d",&m);
#endif
m = 8;
printf("迷宫矩阵的大小为:%d * %d\n", m, m);
/*设定n*n的方阵迷宫*/
/*数组的形式表示八个方向*/
int move[8][2]={{0,1},{1,1},{1,0},
{1,-1},{0,-1},{-1,-1},{-1, 0},{-1, 1}};
/*用结构体表示位置*/
struct position
{
int x;
int y;
};
/*用于记录和输出迷宫探路中相关符号,包括1 .*/
char maze[10][10];
/*用栈来存储探路过程中的数据*/
position stack[64+1];
int top;/*栈顶*/
int i,x,y,ok;
position p;
/*二维数组的第0行、第m+1行、第0列、第m+1列元素全
置成"1",表示迷宫的边界;第1行第1列元素和第m行第m列
元素置成"0",表示迷宫的入口和出口;其余元素值用随机
函数产生。*/
srand(time(0));  /* 产生一个随机种子 */
for(x=1;x<=m;x++)
for(y=1;y<=m;y++)
maze[x][y]=48+rand()%2;
maze[1][1]='0';maze[m][m]='0';     /* 入口 */
for(x=0;x<=m+1;x++)
{
maze[x][0]='1';maze[x][m+1]='1';  /* 边界 */
}
for(y=0;y<=m+1;y++)
{
maze[0][y]='1';maze[m+1][y]='1';  /* 边界 */
}
p.x=1;p.y=1;
top=1;stack[top]=p;
maze[1][1]='.';
/*开始探路
走迷宫的过程可以模拟为一个搜索的过程:每到一
处,总让它按东、东南、南、西南、西、西北、北、东北
个方向顺序试探下一个位置;如果某方向可以通过,并且不
曾到达,则前进一步,在新位置上继续进行搜索;如果个
方向都走不通或曾经到达过,则退回一步,在原来的位置上
继续试探下一位置。
每前进或后退一步,都要进行判断:若前进到了出
口处,则说明找到了一条通路;若退回到了入口处,则说明
不存在通路。*/
do{
p=stack[top];
ok=0;i=0;
while((ok==0)&&(i<8))
{
x=p.x+move[i][0];
y=p.y+move[i][1];
if(maze[x][y]=='0')
{
p.x=x;p.y=y;
stack[++top]=p;
maze[x][y]='.';
ok=1;
}
i++;
}
if(i==8)
{
maze[p.x][p.y]='*';
top--;
}
} while((top>0)&&((p.x!=m)||(p.y!=m)));
/*输出探路结果*/
if(top==0)
{
printf("没有路径\n");
}
else
{
printf("有路径\n");
}
/*输出探路迷宫留下的踪迹*/
#if 0
for(x=1;x<=m;x++)
{
printf("\n");
for(y=1;y<=m;y++)
printf("%c ",maze[x][y]);
}
#else
/*输出整个迷宫*/
for(x=0; x <= m + 1; x++)
{
printf("\n");
for(y=0;y<=m+1;y++)
printf("%c ",maze[x][y]);
}
#endif
printf("\n");
system("pause");
}
return 0;
}

四.调试分析:

测试数据和结果:

有路径的情况,

无路径的情况,

算法时间复杂度:

O(m²)

对相关问题的思考:

       这个迷宫问题的算法中,要在开始设置迷宫的大小。在探索迷宫路线的过程中,是通过不断的尝试来得到最终的结果,由于不能对已经设定为可走路径进行返回,所以在这个算法中有时候可能不能得到走出迷宫的路径。如下:

原文来自: http://wenku.baidu.com/view/43040e73f242336c1eb95e29.html

数据结构课程设计——迷宫问题课程设计报告相关推荐

  1. 数据结构迷宫代码_数据结构课程设计——迷宫求解(二)

    前言 接上文的介绍,本文将主要介绍如何生成随机迷宫,在网上找到的资源也比较多,这里我选取了随机 Prim 算法生成迷宫,选择这个算法的理由如下: 算法思想简单,易于实现 生成的迷宫比较自然,不会出现明 ...

  2. c语言课程设计报告之迷宫,C语言课程设计-迷宫游戏

    <C语言课程设计-迷宫游戏>由会员分享,可在线阅读,更多相关<C语言课程设计-迷宫游戏(15页珍藏版)>请在人人文库网上搜索. 1.计算机技术基础课程设计C语言设计报告题目:完 ...

  3. 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了,想复制完整代码直接复制最下面的,想复制分布代码去看我博客园链接吧 <数据结构与算法分析>课程设计--迷宫问题 - 刷子 ...

  4. 数据结构最短路径例题_《数据结构课程设计》最短路径问题实验报告

    <<数据结构课程设计>最短路径问题实验报告>由会员分享,可在线阅读,更多相关<<数据结构课程设计>最短路径问题实验报告(17页珍藏版)>请在人人文库网上 ...

  5. c语言程序设计报告表达式求值,数据结构 课程设计表达式求值 实验报告

    <数据结构 课程设计表达式求值 实验报告>由会员分享,可在线阅读,更多相关<数据结构 课程设计表达式求值 实验报告(21页珍藏版)>请在人人文库网上搜索. 1.实验课程名称 级 ...

  6. c语言迷宫问题课程报告,基于c语言的迷宫问题课程设计

    基于c语言的迷宫问题课程设计 *******************实践教学*******************兰州理工大学软件学院2012 年春季学期算法与数据结构 课程设计题 目: 迷宫问题 专 ...

  7. c语言程序设计迷宫,C语言程序设计课程设计-迷宫.doc

    C语言程序设计课程设计-迷宫 大 学 C语言程序设计 课程设计(论文) 题目: 迷宫问题 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 讲 师 起止时间: 2009.12.14 ...

  8. 英汉词典c语言实验报告,大学课程英汉电子词典设计报告设计C语言C语言程序设计.doc...

    课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :201101020104 学生姓名 :胡拚 联系方式 指导教师 :陈 ...

  9. c语言宿舍管理设计报告,C语言课程设计—学生宿舍管理系统设计报告.doc

    word格式精心整理版 范文范例 学习指导 课 程 设 计 报 告 课程名称 C语言程序设计 课题名称 学生宿舍管理系统 专 业 班 级 学 号 姓 名 指导教师 2012年6月19日 湖南工程学院 ...

最新文章

  1. Azure恢复服务-使用Windows Backup备份到云端
  2. python自己写包_Python将自己写的模块进行打包
  3. STL源码剖析读书笔记--第6章第7章--算法与仿函数
  4. 【Python进阶】带你使用Matplotlib进行可视化
  5. C语言实现红黑树(附完整源码)
  6. springboot2.5.0 整合 redis 配置详解
  7. 使用Json让Java和C#沟通的方法
  8. setattr()、getattr()、hasattr()【设置属性和方法、得到属性、判断是否有属性和方法】
  9. Magento:Paypal付款不成功返回后不要清空购物车产品的解决方案
  10. java用正则表达式 编写简单词法分析器_500+ 精选 Java 面试题大放送
  11. 详解java二叉排序树_java实现二叉排序树
  12. 初中数学抽象教学的案例_《数学核心素养“数学抽象”的实践案例研究》
  13. linux c 编程一站式学习.pdf,Linux C编程一站式学习
  14. 苹果生产日期对照表2020_AirPods Pro 出现静电噪音,如何参与苹果免费维修服务计划?...
  15. mysql数据库备份还原的几种方式
  16. web前端之Vue——子组件的详解
  17. 曲线之美(一)贝塞尔曲线
  18. WPS工具栏都是灰色不能编辑解决方法分享
  19. C/C++常用函数总结以及在ubuntu和vs中运行
  20. 计算机网络专用术语基本概念

热门文章

  1. JAVA外包服务的整体工作流程有哪些
  2. 华擎主板bios设置图解_【华擎Z170评测】BIOS设置及超频方法简介_华擎 Z170 超频方程式_主板评测-中关村在线...
  3. TCP Data Flow and Window Management(1)
  4. 在C#中使用WIA获取扫描仪数据(三、利用Filter处理图片)
  5. java工作流框架jbpm_【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
  6. 【微信生态圈】-谈谈我的学习经验
  7. Linux常用命令有哪些
  8. 【论文阅读】Scene Text Image Super-Resolution in the Wild
  9. 假设有50瓶饮料,喝完3个空瓶可以换一瓶饮料,依次类推,请问总共喝了多少瓶饮料?
  10. 类的初始化以及实例化