博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构——迷宫问题
阅读量:3903 次
发布时间:2019-05-23

本文共 2930 字,大约阅读时间需要 9 分钟。

  • 数据结构课程设计

  • 迷宫问题求解(栈和队列

任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;

要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;

 

  • 分析

该课设意在考察栈和队列的数据结构,我主要说一下代码的设计思路,供诸君参考,也方便以后自己复习。

要说考察掌握栈和队列最好是自己定义一个栈数据结构,我这里偷懒了,直接用的stack头文件,queue没用上。

  • 迷宫使用0(能走)1(不能走)表示
  • 路径存放在栈中
  • 路径节点包含坐标信息x,y和下一个节点相对于该节点的方向信息next(上0右1下2左3 初始值为-1)
  • 输出路径时需要倒换栈中元素顺序(如果使用自己的数据结构可以避免调换,直接倒序输出)

测试数据已给出在代码最后,我自认为代码注释很明白了,有什么问题或者bug欢迎评论留言

  • Code,环境codeblocks17 通过

// @ChenYe 2018/12/27#include 
#include
#include
#include
#define green SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY)#define white SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN)#define red SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_INTENSITY)#define yellow SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY)#define MAXSIZE 100 // 正方形迷宫的最大尺寸using namespace std;typedef struct Position{ int x,y; // 横纵坐标 int next; // 表示方向,上0右1下2左3 初始值为-1}Position;int SearchWay(int x1,int y1,int x2,int y2,int Maze[MAXSIZE][MAXSIZE]){// 寻找 x1 y1-->x2 y2 的路径 int x,y,next,Find; stack
S; Position p; p.x=x1;p.y=y1;p.next=-1; S.push(p); Maze[x1][y1] = -1; // 走过的路标记为-1 while(!S.empty()) { x = S.top().x; y = S.top().y; next = S.top().next; if(x==x2&&y==y2) // 走到了终点 { cout<<"迷宫路径如下:"<
SO; while(!S.empty()) // 调整栈中元素顺序 { SO.push(S.top()); S.pop(); } while(!SO.empty()) // 输出 { cout<<"("<
<<","<
<<")-->"; SO.pop(); } cout<<"end\n"; return 1; } // 没走到终点 Find = 0; while(next<4&&Find==0) // 查找该位置,即当前(x,y)可以走的方向 { next++; switch(next) { case 0: x = S.top().x-1; y = S.top().y; break; case 1: x = S.top().x; y = S.top().y+1; break; case 2: x = S.top().x+1; y = S.top().y; break; case 3: x = S.top().x; y = S.top().y-1; break; } if(Maze[x][y]==0) // (x,y)可以走 { Find = 1; } } if(Find == 1)// 走得通 {// 标记走的方向, 入栈 S.top().next = next; Position temp; temp.x = x; temp.y = y; temp.next = -1; S.push(temp); Maze[x][y] = -1; // 访问过标记为-1 } else// 走不通 {// 退栈 Maze[S.top().x][S.top().y] = 0; // 迷宫节点回溯为0 S.pop(); } } return 0; // 无路径}void ManuallyCreate(){ int x1,y1,x2,y2; int Maze[MAXSIZE][MAXSIZE]; int n; yellow; cout<<"注意:迷宫为正方形,3<=尺寸<=100;1表示墙壁,0表示路径。"<
>n; cout<<"输入迷宫:"<
>Maze[i][j]; if(Maze[i][j]!=1&&Maze[i][j]!=0) // 迷宫合法检验 { red;cout<<"error input!!!"<
>x1>>y1) { if(Maze[x1][y1]==1) { red;cout<<"起点不可行,请重新输入"<
>x2>>y2) { if(Maze[x2][y2]==1||(x2>=n||y2>=n)) { red;cout<<"终点不可行,请重新输入"<
>x1>>y1) { if(Maze[x1][y1]==1) { red;cout<<"起点不可行,请重新输入"<
>x2>>y2) { if(Maze[x2][y2]==1||(x2>9||y2>9)) { red;cout<<"终点不可行,请重新输入"<
>choice; if(choice==2) { system("cls"); AutomaticallyCreate(); } else if(choice==1) { system("cls"); ManuallyCreate(); } else { red; cout<<"error input!!!"<

转载地址:http://pjoen.baihongyu.com/

你可能感兴趣的文章
texstudio语法检查
查看>>
ComboBox用AddString添加字符显示乱码
查看>>
基于CSerialPort修改类的串口调试助手源代码(支持中文、自动保存等)
查看>>
MFC下边自动寻找串口
查看>>
PID调节经验
查看>>
机器学习经典书籍
查看>>
Latex排版全解
查看>>
2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM
查看>>
北航王田苗教授:国内外机器人发展热点与趋势(精华版)
查看>>
windows常用软件收集
查看>>
Markdown语法注意借鉴
查看>>
Java 容器Collection(5)
查看>>
Java IO操作(6)
查看>>
Java数组(3)
查看>>
Java线程(7)
查看>>
Java GUI基础(9)
查看>>
Java网络基础(8)
查看>>
Java_正则表达式
查看>>
如何通俗地解释 PID 参数整定?
查看>>
简单滤波算法的资料
查看>>