为什么80%的码农都做不了架构师?>>>   

#include<iostream>
using namespace std;//=======================================位置(坐标)类========================
class Coordinate
{friend class Node;friend class LinkStack;friend bool mazePath(char **maze, int m);//迷宫路径 public:Coordinate();int row;int col;
}; //=======================================链栈的结点类========================class Node
{friend class LinkStack;public:Node();Coordinate data;Node *next;
};//=======================================链栈类================================class LinkStack
{friend bool mazePath(char **maze,int m);public:void Recursion(Node *p);//递归函数 void PrintStack(LinkStack &L);bool Empty(LinkStack &L);Coordinate DeleteStack(LinkStack &L);void AddStack(LinkStack &L,Coordinate N);LinkStack();private:Node *top;
};//========================================位置类的初始化函数====================
Coordinate::Coordinate()
{row = 1;col = 1;
}//=======================================结点类的初始化函数===================== Node::Node()
{next = NULL;
}//=========================================堆栈类的初始化函数===================LinkStack::LinkStack()
{top = NULL;
}//===========================================入栈===============================void LinkStack::AddStack(LinkStack &L,Coordinate N)
{Node *p = new Node;p->data = N;p->next = L.top;L.top = p;
}//==========================================出栈================================
Coordinate LinkStack::DeleteStack(LinkStack &L)
{Node *p = L.top;Coordinate N = top->data;L.top = p->next;delete p;return N;
}//=========================================判断栈是否为空=======================bool LinkStack::Empty(LinkStack &L)
{return (top = NULL) ? 1:0;
}
//=========================================递归输出栈的内容=====================void LinkStack::PrintStack(LinkStack &L)
{Node *p = new Node;p = L.top;LinkStack::Recursion(p);cout << '(' << p->data.row << ',' << p->data.col << ')' << "--->";
}//=========================================递归函数=============================void LinkStack::Recursion(Node *p)
{if(p->next){p = p->next;LinkStack::Recursion(p);cout << '(' << p->data.row << ',' << p->data.col << ')' << "--->";}
}//=============实现迷宫算法,返回值为是否到达迷宫出口的布尔值====================bool mazePath(char maze[7][7], int m)
{LinkStack path;//初始化偏移变量Coordinate move[4];move[0].row = 0;move[0].col = 1;//向右移动move[1].row = 1;move[1].col = 0;//向下移动move[2].row = 0;move[2].col = -1;//向左移动move[3].row = -1;move[3].col = 0;// 向上移动//像迷宫周围增加一圈障碍物for(int i = 0;i <= m + 1;i ++){maze[i][0] = maze[i][m + 1] = '#'; //左和右maze[0][i] = maze[m + 1][i] = '#'; //上和下}Coordinate now;now.row = 1;now.col = 1;maze[1][1] = 'x'; //阻止返回入口int choose = 0;int lastchoose = 3;//搜索一条路径while(now.row != m || now.col != m){int newr,newc;while(choose <= lastchoose)//依次选择路径 {newr = now.row + move[choose].row;newc = now.col + move[choose].col;if(maze[newr][newc] == '0'){break;}choose ++;          //进行下一次选择}if(choose <= lastchoose){//若找到相邻位置则移动到maze[newr][newc]path.AddStack(path,now);now.row = newr;now.col = newc;maze[newr][newc] = 'x';//设置障碍物,以阻止再次访问choose = 0;}else      //如果没有找到相邻位置则回溯 {if(path.Empty(path)) {return false;}Coordinate Next;//Next用来存放四周都没有通路的这个结点的上一个结点,//注意next的下一个结点就是now,可是这个now已经没有路可走了,//所以就只能在next后面再取一个路实验,看新取得的路有没有通路Next = path.DeleteStack(path);//将这个结点删除,把该结点的值赋给Next,//注意此时now是next取的用来探路的点,可是此时now无路可走 //本实验用来搜寻有没有路的顺序依次是右下左上 if(now.col - Next.col == 1 && now.row - Next.row == 0)//如果now 在 Next的右边 {choose = 1;}else if(now.col - Next.col == 0 && now.row - Next.row == 1)//如果 row 在 Next 的下面 {choose = 2;}else if(now.col - Next.col == -1 && now.row - Next.row == 0)//如果 row 在 Next 的下面 {choose = 3;}else if(now.col - Next.col == 0 && now.row - Next.row == -1)//如果row 在 Next 的上面{choose = 4;//设置为大于3的数,说明Next该点周围都没有通路,再进行递归的话,就会重新在退一个位置进行判断 } now = Next;}}//显示迷宫地图cout << "迷宫地图:" << '\n' << endl;for(int col = 0;col < 7;col++){cout << '\t' << col << "列";}cout << '\n';for(int mi = 0;mi < 7;mi++){cout << mi << "行";for(int mj = 0;mj < 7;mj++){cout << '\t' << maze[mi][mj];}cout << '\n' << '\n';}cout << '\n';cout << "迷宫路径:" << '\n' << endl;path.PrintStack(path);cout << '(' << m << ',' << m << ')' << '\n' << '\n';return true;//到达迷宫出口
}
//======================主函数,调用mazePath()函数===============================int main()
{int m = 5;char maze[7][7];//初始化迷宫数组for(int i = 1;i <= m;i ++){for(int j = 1;j <= m;j ++){maze[i][j] = '0';}}//设置迷宫maze[1][2] = '#';maze[2][2] = '#';maze[2][4] = '#';maze[2][5] = '#';maze[3][4] = '#';maze[4][2] = '#';maze[5][2] = '#';maze[5][4] = '#';mazePath(maze,m);system("pause");return 0;
}

转载于:https://my.oschina.net/clear/blog/55572

链栈和递归实现迷宫算法相关推荐

  1. 数据结构与算法:09 栈与递归

    09 栈与递归 知识结构: 栈是我们经常使用的一种数据结构,比如,手枪发射子弹的顺序与子弹压入弹夹的顺序是相反,即后压入弹夹的子弹先发射出来.又比如,我们使用的Word.Excel.Photoshop ...

  2. Datawhale组队学习 Task03:栈与递归(2天)

    Task03:栈与递归(2天) 栈是我们经常使用的一种数据结构,如下图所示,手枪发射子弹的顺序与子弹压入弹夹的顺序是相反,即后压入弹夹的子弹先发射出来. 比如我们使用的Word.Excel.Photo ...

  3. 用链栈实现简易四则运算计算器(php版)

    栈是一种限定仅在表尾进行插入和删除操作的线性表.栈的应用有很多,比如常见的递归,计算机表达式求值等.下面我们用栈来实现简易的四则运算计算器. 列一下本文的思路: 实现链栈的数据结构及其操作 中缀表达式 ...

  4. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  5. 数据结构(C语言版)之栈及递归

    目录 前言 正文 一.栈 1.栈的概念及术语 1.定义 2.逻辑结构 3.存储结构 4.运算规则 5.实现方式 6.栈是一种特殊的线性表,它的逻辑结构和存储结构与线性表相同,其特殊性体现在" ...

  6. 栈详解(顺序栈和链栈)

    栈 什么是栈? 顺序栈 链栈 什么是栈? 栈是一种基本数据结构,因其拥有后进先出的特点(Last in First out),也就是LIFO,栈的一种常见用途就是用来判断一串字符中的括号是否有效. 括 ...

  7. 如何使用栈非递归地求解Ackerman函数

    Ackerman 函数如下: 如果用递归算法求 A(m, n) 非常简单: int Ackerman(m, n) {if(m==0)return n+1;else if(m>0 &&am ...

  8. 利用栈和递归实现进制转换——数据结构实验报告

    一.实验名称:栈的应用--进制转换 二.实验目的 熟练掌握栈的两种存储方式的具体实现过程,并分别使用递归和非递归两种方式,实现进制转换. 三.实验要求 顺序栈和链栈两种存储方式任选一种,实现从十进制到 ...

  9. 数据结构栈(顺序栈、链栈、插入push、删除pop)、队(循环队,链队、入队push,出队pop)知识点梳理

    数据结构栈知识点梳理 一 栈的定义 栈(stack)是限定仅在表尾进行插入和删除操作的线性表 不含任何元素的栈称为空栈 允许插入和删除的一端成为栈顶(top),另一端称为栈底(bottom) 具有LI ...

最新文章

  1. 微服务、DevOps…不是效率银弹,请同时升级你的管理方式
  2. 从频率角度理解为什么深度可以加速神经网络的训练
  3. 朝着理想坚实迈进_坚实原则:开放/封闭原则
  4. c++指针总结(易混淆)
  5. 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...
  6. nginx https ssl 配置
  7. 注意,Dubbo 存在高危反序列化漏洞!
  8. python读取文件时提示“UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 1264: illegal multi
  9. python 两个列表比较_如何在Python中比较两个列表
  10. 第六章 静电场中的导体和电介质
  11. 杰控组态软件的“远程连接服务”使用要点
  12. java生成word并导出pdf
  13. pytorch多进程加速及代码优化
  14. 房子装饰风水有哪些讲究和忌讳
  15. MPAndroidchart自定义样式二在柱状图上显示文本和间断式显示柱状图
  16. python爬取discuz_爬虫技术实践(二)Discuz! 按板块爬取帖子内容实战
  17. 服务器主板准系统怎么拆,主板准系统及电源装箱步骤完成_技嘉 GA-B85M-D3V_主板评测-中关村在线...
  18. Spring Boot、Spring Cloud 自定义配置文件(如何整合配置中心)
  19. MATLAB打开nc文件并读取nc文件数据
  20. LaTex公式、函数、希腊字母、符号、运算符号总结

热门文章

  1. 接口测试--apipost变量使用(一)
  2. api 另一窗体 之上_12 个设计 API 的安全建议,不要等出事儿了“捶胸顿足”
  3. 什么是HTML5前端开发?HTML5前端要学哪些技术?
  4. 13个你必须知道的JS数组技巧
  5. 前端开发工程师,找工作应该选择大公司还是小公司?
  6. PTA-基础编程题目集-函数题 ……
  7. 写一个c语言的链表记录一下
  8. Nodejs获取MySQL数据_nodejs同步调用获取mysql数据时遇到的大坑
  9. 电脑屏幕卡住了按什么都没反应_90%的电脑问题都能解决,只要学会这8个字!...
  10. github博客突然无法访问_紫菜头博客被DNS污染攻击关站