课程名称:数据结构与算法

设计题目:迷宫问题

已知技术参数和设计要求:

问题描述:

以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。迷宫问题要求求出从入口(1,1)到出口(m,n)的一条通路,或得出没有通路的结论。

基本要求:

首先实现一个以链表作存储结构的栈类型,然后编写一个求迷宫问题的非递归程序,求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标, d表示走到下一坐标的方向。

测试数据:

迷宫用伪随机数产生程序产生。

左上角(1,1)为入口,右下角(m,n)为出口。

选作内容:

1.编写递归形式的算法,求得迷宫中的所有可能的通路。

2.以方阵的形式输出迷宫及其通路迷宫中的所有可能的通路。

基本思路:

1.创建一个二维数组代表迷宫,另外在创建一个的等大且初值全为“0”的二维数组,用来在寻找通路的函数中记录位置。

2.创建一个栈结构体,用来存储路线(走过的点压进栈,走不通返回则弹栈)。

3.定义上、下、左、右、上左、上右、下左、下右八个遍历方向(如果是四个方向的话非常容易出现死路,且不符合实际)。

代码及相关注释如下:

#include <stdio.h>
#include <stdlib.h>
#include<time.h>#define size 100
#define M 100
#define N 100typedef struct
{int x;//横int y;//纵
}position;typedef struct stack
{
int row;//行
int col;//列
int dir;//方向
}date;typedef struct//定义栈
{date stack[size] ;int top;
}tstack;position direction[8]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};//八个遍历方向 int sum=0;
int maze[M][N];
int maze_2[M+2][N+2]={0};//等大全为0的数组
int m,n;void push(tstack*s,date x)//压栈
{if(s->top==size-1)//从0开始,所以size-1 printf("栈满了");else{s->top++;s->stack[s->top]=x;//把x赋给top指向的栈顶 }
}void pop(tstack*s)//弹栈
{if(s->top==-1)//判断栈顶的值来判断是否为空栈 printf("栈空");else{s->top--;//弹出栈顶元素 }
}void print_path(int sum,tstack s)
{int a;printf("第 %d 条通路:\n",sum);for(a=0;a<s.top;a++)printf("(%d,%d,%d)->",s.stack[a].row ,s.stack[a].col,s.stack[a+1].dir );//输出栈里的元素 ,三元坐标 printf("出口\n"); printf("\n");
}void path(int x,int y,tstack e)//寻找迷宫的通路
{
int i,a,b,c;
date t;//引用结构体date
if(x==m&&y==n)//判断是否到(m,n)出口
{sum++;print_path(sum,e);//调用打印迷宫(print_path)函数 } else{for(i=0;i<8;i++)//遍历八个方向 {a=x+direction[i].x;//判断走向 b=y+direction[i].y;c=i;if(!maze[a][b]&&!maze_2[a][b])//可以走的路,相当于if(1&&1) {t.row=a;t.col=b;t.dir=c;maze_2[a][b]=maze[a][b]=1;//走过的地方在maze和maze_2中标记为1 push(&e,t);//然后存到栈里面去 path(a,b,e);//在path函数自身调用path函数 ,获得点 maze_2[a][b]=maze[a][b]=0;//将位置清空,表示没有走过的路 pop(&e);//走不通的点,弹栈弹出走不通的点 }}}
}/*主函数部分*/
int main()
{
int a,b;tstack *s;//初始化栈
s=(tstack *)malloc(sizeof(tstack));
s->stack[0].row =1;
s->stack[0].col=1;
s->top=0;maze_2[1][1]=maze[1][1]=1;printf("输入迷宫行数和列数:\n");
scanf("%d %d",&m,&n);srand((unsigned)time(NULL));//随机迷宫
for(a=0;a<m+2;a++)
{for(b=0;b<n+2;b++){maze[a][b]=rand()%2;//只有0和1的随机迷宫if(a==m&&b==n) {maze[a][b]=0;//出口设为0 maze[1][1]=0; //入口设为0 }}
}
for (a = 0; a < n + 2; a++) maze[0][a] = 1;//上 墙 (上下左右的墙用1代表,即为输出中的“#”)
for (a = 0; a < m + 2; a++) maze[a][0] = 1;//左 墙
for (a = 0; a < n + 2; a++) maze[m+ 1][a] = 1;//下 墙
for (a = 0; a < m + 2; a++) maze[a][n + 1] = 1;//右 墙
for (a = 0; a < n; a++) maze[m][a] = 1;printf("随机迷宫:\n");for(a=0;a<m+2;a++)
{for(b=0;b<n+2;b++){if (maze[a][b] == 1)printf("#");//“#”代表墙 else if(maze[a][b]==0)printf(" ");//“ ”代表可到到达的地方
}
printf("\n");
}path(1,1,*s);//调用path函数得到通路
return 0;
}

注意:本代码仅供参考!

数据结构与算法——迷宫问题相关推荐

  1. 数据结构与算法 迷宫问题

    迷宫问题问题描述: 栈的实现在这篇博客中:https://blog.csdn.net/zj1131190425/article/details/87991662 迷宫是一个矩形区域,有一个出口和入口, ...

  2. 数据结构与算法 迷宫夺宝 C语言

    迷宫夺宝 1.1 题目要求 一个N x N的矩阵代表了一个迷宫,迷宫中每个房间由以下三种数字的一种来表示:     0 代表房间安全,是可以通过的.     1 代表房间中有奖励物品,玩家可以拿到奖励 ...

  3. 数据结构和算法(十)递归-迷宫游戏

    1. 数据结构和算法(十)递归-迷宫游戏 1.1 迷宫游戏   今天做一个简单的迷宫游戏,用二维数实现地图,让程序自动寻路的小游戏. 1.2 简单的迷宫 简单的迷宫 用二维数实现地图,找路策略:[右- ...

  4. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

  5. 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)

    文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...

  6. 数据结构与算法(Python)– 回溯法(Backtracking algorithm)

    数据结构与算法(Python)– 回溯法(Backtracking algorithm) 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条 ...

  7. 数据结构与算法之递归系列

    本文来自一个不甘平凡的码农 写在前边 几个月之前就想写这样一篇文章分享给大家,由于自己有心而力不足,没有把真正的学到的东西沉淀下来,所以一直在不断的在自学. 然后又用了一个星期的时间去整理.分类,才有 ...

  8. PTA 数据结构与算法题目集(中文)

    一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...

  9. 【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)

    一. 搜索算法 深度优先搜索和广度优先搜索是最暴力的图的搜索算法.算法的目标是,给定一张图,一对初始和终止节点,找到两节点之间的节点路径.(代码均是找到两个节点之间的路径) 广度优先搜索是一层一层搜索 ...

最新文章

  1. 图解 Kafka,一目了然!
  2. 里面使用轮播_小程序ColorUI框架初步使用教程及个人项目实战
  3. python 遍历_python中使用iterrows()对dataframe进行遍历的示例
  4. Streamy 使用RDBMS
  5. 转json_Java对象转JSON时如何动态的增删改查属性
  6. C++ 文件头 static char THIS_FILE[] = __FILE__
  7. MyBatis复习(十):注解开发
  8. k3s 卸载_Mac-Homebrew安装/卸载/更换国内镜像源
  9. DebugDiag调试工具
  10. 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
  11. 昨晚学妹参加了B站秋招笔试,还想考考我?
  12. 回溯法——素数环C++实现
  13. Atitit 方法运行器methodRunnerV3 方法虚拟机 vm 新特性 java -cp C:\0wkspc\methodRunner\bin -Djava.ext.dirs=
  14. 压力测试工具JMeter入门教程
  15. QML用openGL渲染NV12
  16. OA办公系统能帮助企业做些什么?
  17. Vue中实现将页面生成微信二维码
  18. uq mysql_MySQL workbench中的PK,NN,UQ,BIN,UN,ZF,AI说明
  19. 百家号不收录限流无推荐阅读为零抄袭的解决方法!
  20. HC-05-USB蓝牙模块绑定唯一的蓝牙模块

热门文章

  1. 华南理工提出多模态ReID新数据集,语义自对齐网络SSAN达到SOTA性能!代码数据集均已开源!...
  2. 20P60 PR模板预设10 VHS专业预设包制作旧镜头复古磁带效果含背景音乐
  3. STC12C5A60S2 AD 转换详解
  4. Java 接收返回json数据动态取data里的值
  5. 易语言大漠实现辅助一键启动游戏
  6. 《Pytorch 模型推理及多任务通用范式》第三节作业
  7. 百度云网盘批量分享独立链接,简单暴力!!! 不用下载软件,直接在网页上搞定!
  8. pinterest数据科学家访谈
  9. FireFox火狐浏览器设置不加载图片
  10. 文件太大notepad 打不开怎么办