#include "iostream"
#include "malloc.h"
#define TRUE 1;
#define FALSE 0;
#define INIT_STACK_SIZE 20
#define INCREATE_STACK_SIZE 10
typedef int Status;
using namespace std;//位子坐标
struct Position
{int x;int y;
};typedef struct
{Position pos;int di;
}SElemType;typedef struct
{SElemType * base;SElemType * top;int sizeStack;
}MazeStack;Position BeginPos;
Position EndPos;
int w, h;;Status InitStack(MazeStack & maze)
{maze.base = (SElemType *)malloc(sizeof(SElemType) * INIT_STACK_SIZE);if (maze.base == NULL)return FALSE;maze.top = maze.base;maze.sizeStack = INIT_STACK_SIZE;return TRUE;
}Status IsEmpty(MazeStack & maze)
{if (maze.base == maze.top)return TRUE;return FALSE;
}Status Push(MazeStack & maze, SElemType & ele)
{if (maze.base - maze.top >= maze.sizeStack){maze.base = (SElemType *)realloc(maze.base, sizeof(SElemType) * (INCREATE_STACK_SIZE + maze.sizeStack));if (maze.base == NULL)return FALSE;maze.top = maze.base + maze.sizeStack;maze.sizeStack = maze.sizeStack = INCREATE_STACK_SIZE;}*maze.top = ele;maze.top++;return TRUE;
}Status Pop(MazeStack & maze, SElemType & ele)
{if (maze.base == maze.top)return FALSE;ele = *(--maze.top);return TRUE;
}Status GetTail(MazeStack & maze, SElemType & ele)
{if (IsEmpty(maze))return FALSE;ele = *(maze.top - 1);return TRUE;
}//判断是否是墙
Status Pass(int **a, Position & pos)
{if (a[pos.x][pos.y] == 0)return FALSE;return TRUE;
}//走过的话,标记为2
void FootPrint(int ** a, Position & pos)
{a[pos.x][pos.y] = 2;
}//设置为墙
void MarkPrint(int ** a, Position & pos)
{a[pos.x][pos.y] = 0;
}//判断是否走过
SElemType  NextPos(int **a, SElemType & ele)
{switch (ele.di){//向东寻找case 1:ele.pos.x++;if (a[ele.pos.x][ele.pos.y] != 2)break;ele.pos.x--;//继续寻找下去//向南寻找case 2:ele.pos.y++;if (a[ele.pos.x][ele.pos.y] != 2)break;//继续寻找下去ele.pos.x--;//向西寻找case 3:ele.pos.x--;if (a[ele.pos.x][ele.pos.y] != 2)break;ele.pos.x++;//最后一个方向,如果走过的话,那么必然是死路,那么就将其变成墙case 4:ele.pos.y--;if (a[ele.pos.x][ele.pos.y] == 2){MarkPrint(a, ele.pos);//设为墙ele.pos.y++;}break;}return ele;
}Status CreateMaze(int ** & a)//如果不传引用的话,就应该传*** a
{int temp;cout << "请输入迷宫的长,宽: ";cin >> w;cin >> h;cout << "请输入迷宫: " << endl;a = (int **)malloc(sizeof(int *) * h);if (a == NULL){cout << "创建迷宫失败!" << endl;return FALSE;}for (int i = 0; i < h; i++){a[i] = (int *)malloc(sizeof(int) * w);if (a[i] == NULL){cout << "创建迷宫失败!" << endl;return FALSE;}for (int j = 0; j < w; j++){scanf_s("%d", &temp);a[i][j] = temp;}}cout << "请输入入口:" << endl;cin >> BeginPos.x;cin >> BeginPos.y;cout << "请输入出口:" << endl;cin >> EndPos.x;cin >> EndPos.y;cout << "迷宫创建成功!" << endl;for (int i = 0; i < h; i++){for (int j = 0; j < w; j++)cout << a[i][j] << " ";cout << endl;}
}void DistroyMaze(int ** &a)
{for (int i = 0; i < h; i++)delete a[i];delete a;
}void MazePath(int ** a, MazeStack & mazeStack)
{SElemType ele;ele.pos.x = BeginPos.x;ele.pos.y = BeginPos.y;ele.di = 1;do{if (Pass(a, ele.pos)) //如果不是墙{ele.di = 1;//如果不是墙的话, 就默认寻找东方Push(mazeStack, ele); //压栈FootPrint(a, ele.pos);//标记走过if (ele.pos.x == EndPos.x && ele.pos.y == EndPos.y) //如果是出口,不再循环break;ele = NextPos(a, ele); //寻找东方是否走过}else //如果是墙{if (!IsEmpty(mazeStack)){Pop(mazeStack, ele);//返回上一步while (ele.di == 4 && !IsEmpty(mazeStack)) //如果回路上有好几个格子的四周都是探索过的那么,都在迷宫中这些格子置为墙壁{MarkPrint(a, mazeStack.top->pos);Pop(mazeStack, ele);}if (ele.di < 4){ele.di++;Push(mazeStack, ele); //如果四个方向没有检查完,把刚出栈的重新入栈ele = NextPos(a, ele);}}}if (ele.di == 4 && IsEmpty(mazeStack)){cout << "该迷宫没有出路!" << endl;break;}} while (true);
}//输出倒着了
void ShowMaze(int ** & a, MazeStack & mazeStack)
{SElemType ele;while(!IsEmpty(mazeStack)){Pop(mazeStack, ele);cout << "( " << ele.pos.x << "," << ele.pos.y << " )  ";}
}int main()
{MazeStack mazeStack;InitStack(mazeStack);int ** a = NULL;CreateMaze(a);cout << "---------------------------------" << endl;MazePath(a, mazeStack);ShowMaze(a, mazeStack);DistroyMaze(a);system("pause");return 0;
}
/*
测试数据:
1 1
3 3
0 0 0 0 0
0 1 1 1 0
0 1 0 0 0
0 1 1 1 0
0 0 0 0 0*/

数据结构 严蔚敏 迷宫求解 代码相关推荐

  1. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

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

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

  3. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  4. 数据结构 严蔚敏 第二章 线性表

    数据结构 严蔚敏 第二章 线性表 线性表:由n个(n>=0)数据特征相同的元素构成的有限序列. 线性表的类型定义表示和实现 顺序表 存储单元地址连续 随机存取 若每个元素占用 m 个存储单元,以 ...

  5. 【计算机】数据结构-严蔚敏/清华大学P3

    [计算机]数据结构-严蔚敏/清华大学P1 第二章    线  性表 线性结构 是 一个数据元素的有序(次序)集 线性结构的基本特征: 1.  集合中必存在唯一的一个"第一元素": ...

  6. 数据结构严蔚敏代码合集 严书数据结构代码实现 可直接运行 持续更新by myself

    建议收藏关注,与严书代码高度一致且可实现运行. 有没更新的或者希望快点的可以催更哦. 版权声明:本文为CSDN博主「七灵微」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本 ...

  7. 数据结构----严蔚敏

    最近一直想找一本纯数据结构的书来学习,找来找去都没有找到一本合适的书籍,相比之下国内的书籍之中,严蔚敏和吴伟民的还算是经典版了,很多国内其他数据结构教材都参考这本书的.但缺点是很多都是伪代码,对编程初 ...

  8. 数据结构严蔚敏清华大学pdf_2019年清华大学自动化系控制工程专业大数据方向考研经验分享...

    基本情况(以下内容仅代表个人观点) 我目前就读于西南某双非石油工程专业,2019考研报考清华大学自动化系大数据工程专业,一志愿复试被刷,侥幸调剂录取至微电子系.初试总分346分(政治-63 + 英语一 ...

  9. 线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现

    实现工具:dev 顺序表功能: 创建一个空的线性表: 在线性表中插入元素: 在线性表中删除元素: 在线性表中查找元素: 代码:(详解请看注释) #include<stdio.h> #inc ...

  10. python迷宫求解代码_Python中的迷宫求解

    我孜孜不倦地试图用python制作一个迷宫解算器.我已经使用了我所有的资源,比如朋友.互联网和堆栈.我已经根据之前的堆栈问题修改了很多代码,但是即使完全复制代码(我不喜欢这样做),也无法得到答案.在 ...

最新文章

  1. hdu6380(2018 “百度之星”程序设计大赛 - 初赛(B))
  2. volatile能保持线程安全吗_从volatile说到i++的线程安全问题
  3. mysqlplus 批量插入_ibatis结合oracle批量插入三种方法的测评
  4. cannot find symbol [ERROR] symbol: class DistributedFileSystem
  5. python 根据时间间隔删除文件夹内修改时间比较早的文件
  6. JavaWeb——Get、Post请求中文乱码问题
  7. 全连接神经网络_二十九.全连接神经网络原理
  8. SQL Server中唯一索引和唯一约束之间的区别
  9. 被苹果“先捧后杀”的操作系统
  10. paddle2.0实现DNN(minst数据集)
  11. java五子棋程序_Java五子棋游戏
  12. python整形_Python中的最大整型数值
  13. tif转换成jpg格式
  14. Linux环境下YUM和DNF详细介绍
  15. 适合学生党上手测试的免费云服务器推荐
  16. 项目上线质量如何评估
  17. 研发人员的特质_9个有效开发人员的人格特质
  18. 华为AirEngine 5762S-11面板AP配置
  19. 什么是HTTPDNS?HTTPDNS有哪些作用?
  20. 语义分割系列24-PointRend(pytorch实现)

热门文章

  1. 做什么样的软件才能赚钱?
  2. Factorization Machines 论文翻译
  3. java 编写桌面_利用Java技术编写桌面软件基础
  4. 金融431可以带计算机,南京大学金融431可以带计算器吗?
  5. 未检测到正确安装的网络适配器_网络适配器图标出现黄色感叹号的解决办法
  6. 结构化数据、半结构化数据和非结构化数据分析
  7. 人行征信中心提醒:不要随意授权征信查询!
  8. 15分钟用ppt制作桌面整理四格壁纸
  9. VINS-MONO边缘化策略
  10. enfuzion与lsf构建渲染集群_集群渲染系统构建及优化-精选文档