问题及要求: 迷宫问题的求解包括以下功能:
  对于给定的一个迷宫,给出一个出口和入口,找一条从入口到出口的通路,并把这条通路显示出来;如果没有找到这样的通路给出没有这样通路的信息。迷宫求解详细要求如下:
(1) 可以用一个m×n的二维数组表示迷宫,0和1分别表示迷宫中的通路和障碍。
(2) 该迷宫可以预先设定,也可以随机生成,或是根据提示设定,m,n均不小于20。
(3) 编写一个求解迷宫的程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
(4) 迷宫求解通常用的是“穷举求解“方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。
(5) 要求应用栈的特点完成迷宫求解。

代码实现:

#include<iostream>
#include<cstdlib>
#include<stdlib.h>
#include<cstdio>
#include<time.h>
#define Max_Size 1000
using namespace std;
int m,n;
int flag=1;
enum Direcation {//迷宫中要走的方向,对应映射值Up = 1,Down = 2,Left = 3,Right = 4
};
typedef struct {//迷宫中坐标(x,y)int x, y;
} Coordinate;
typedef struct {//定义当前点的坐标,以及接下来要走的方向Coordinate coord;Direcation direcation;
} Node;
class Stack {//定义一个栈的类,模拟栈的实现public:Stack();bool IsEmpty() const;//判断栈是否为空bool IsTopful() const;//判断栈是否满了bool Push(Node Pushed);//入栈bool Pop();//出栈const Node& GetTop() const;//获取栈顶坐标点void Output() const;//输出坐标信息private:Node stack[Max_Size];//定义坐标点 个数为最大值unsigned int top;
};
Stack::Stack() {top = 0;
}
bool Stack::IsEmpty() const {return (top == 0);
}
bool Stack::IsTopful() const {return (top == Max_Size + 1);
}
bool Stack::Push(Node Pushed) {if (IsTopful())return false;else {stack[top] = Pushed;top++;return true;}
}
bool Stack::Pop() {if (IsEmpty())return false;else {top--;return true;}
}
const Node& Stack::GetTop() const {return stack[top - 1];
}
void Stack::Output() const {for (unsigned int inset = 0; inset < top; inset++) {//将所有合法形成的路径输出cout << "("<<stack[inset].coord.x + 1 << "," << stack[inset].coord.y + 1 << ",";switch (stack[inset].direcation) {case Up:cout << "Up)";break;case Down:cout << "Down)";break;case Left:cout << "Left)";break;case Right:cout << "Right)";break;default:cout << "Unknow";}cout << endl;}printf("(%d,%d,出口)",m,n);cout << endl;return;
}
void Check(const bool MAZE[][25], bool MARK[][25], Stack &wizard, Coordinate coord);//检查当前坐标点是否合法
void OutputMaze(const bool MAZE[][25]);//输出迷宫地图
const Coordinate Origin = { 0, 0 }, Terminal = { m-1, n-1 };//确定起始点和终止点
int main() {Stack wizard;Coordinate coord = Origin;printf("*********************走迷宫*********************\n");printf("                 1.自定义迷宫 \n");printf("                 2.自动生成迷宫 \n");printf("                 3.退出 \n");printf("*********************请选择*********************\n");int choice;bool MAZE[25][25]; //迷宫地图scanf("%d",&choice);if(choice==3)return 0;cout<<"请输入迷宫行数和列数:\n";bool MARK[25][25];cin>>m>>n;cout<<"请输入迷宫数据:\n";if(choice==1) {for(int i=0; i<m; ++i) {for(int j=0; j<n; j++) {scanf("%d",&MAZE[i][j]);MARK[i][j]=1;}}} else if(choice==2) {for(int k=0; k<m; k++)for(int j=0; j<n; j++) {int i;i = rand()%2*1000;MAZE[k][j]=i;MARK[k][j]=1;}}MAZE[0][0]=0;MAZE[m-1][n-1]=0;cout<<"迷宫地图显示.\n";OutputMaze(MAZE);cout<<"回溯过程:"<<endl;Check(MAZE, MARK, wizard, coord);if(!flag) {cout<<endl<<"可行路径:"<<endl;wizard.Output();}system("pause");return 0;
}
void Check(const bool MAZE[][25], bool MARK[][25], Stack &wizard, Coordinate coord) {Node now;MARK[coord.x][coord.y] = false;//标记当前点已遍历过if (coord.x == m-1&&coord.y == n-1)return;//1.看是否到达终点,到就返回,不到继续遍历if (MARK[coord.x - 1][coord.y] && MAZE[coord.x - 1][coord.y] == 0) { //如果合法,向上遍历now.coord = coord;flag=0;now.direcation = Up;//2.记录当前点可行wizard.Push(now);//3.把当前点压入栈中cout<<"("<<now.coord.x+1<<","<<now.coord.y+1<<",";switch (now.direcation) {case Up:cout << "Up)\n";break;case Down:cout << "Down)\n";break;case Left:cout << "Left)\n";break;case Right:cout << "Right)\n";break;default:cout << "Unknow";}coord.x--;//4.将当前点向上走一步。Check(MAZE, MARK, wizard, coord);//5.进入下一次判断} else if (MARK[coord.x][coord.y - 1] && MAZE[coord.x][coord.y - 1] == 0) { //如果合法,向左遍历now.coord = coord;flag=0;now.direcation = Left;wizard.Push(now);cout<<"("<<now.coord.x+1<<","<<now.coord.y+1<<",";switch (now.direcation) {case Up:cout << "Up)\n";break;case Down:cout << "Down)\n";break;case Left:cout << "Left)\n";break;case Right:cout << "Right)\n";break;default:cout << "Unknow"<<endl;}coord.y--;//向左走一步Check(MAZE, MARK, wizard, coord);} else if (MARK[coord.x][coord.y + 1] && MAZE[coord.x][coord.y + 1] == 0) { //如果合法,向右遍历now.coord = coord;flag=0;now.direcation = Right;wizard.Push(now);cout<<"("<<now.coord.x+1<<","<<now.coord.y+1<<",";switch (now.direcation) {case Up:cout << "Up)"<<endl;break;case Down:cout << "Down)"<<endl;break;case Left:cout << "Left)"<<endl;break;case Right:cout << "Right)"<<endl;break;default:cout << "Unknow";}coord.y++;//向右走一步Check(MAZE, MARK, wizard, coord);} else if (MARK[coord.x + 1][coord.y] && MAZE[coord.x + 1][coord.y] == 0) { //如果合法,向下遍历flag=0;now.coord = coord;now.direcation = Down;wizard.Push(now);cout<<"("<<now.coord.x+1<<","<<now.coord.y+1<<",";switch (now.direcation) {case Up:cout << "Up)\n";break;case Down:cout << "Down)\n";break;case Left:cout << "Left)\n";break;case Right:cout << "Right)\n";break;default:cout << "Unknow";}coord.x++;//向下走一步Check(MAZE, MARK, wizard, coord);} else {if(coord.x==0&&coord.y==0) {flag=1;cout<<"无解\n";return ;}coord = wizard.GetTop().coord;//2.碰壁了,取上一个合法坐标向下一个方向试探wizard.Pop();//3.上一个合法点出栈Check(MAZE, MARK, wizard, coord);//4.接着下一个方向试探}return;
}
void OutputMaze(const bool MAZE[][25]) {for (int inset = 0; inset < m; inset++) {for (int inset1 = 0; inset1 < n; inset1++) {if (MAZE[inset][inset1])//迷宫如果坐标点是 1 ,输出 1cout << "1 ";elsecout << "0 ";//如果迷宫坐标点是 0 ,输出 0}cout << endl;}cout << endl;
}

课程设计:迷宫问题的求解相关推荐

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

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

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

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

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

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

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

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

  5. 《数据结构》课程设计-迷宫求解

    这是我自己去年写的,现在发布仅供参考 1 设计目标 迷宫问题:编写一个程序求解迷宫问题.迷宫以m行n列的长方阵表示,0和1分别表示迷宫中通路和障碍.设计一个程序,对任意设定的迷宫,求出一条入口到出口的 ...

  6. c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc

    计算机技术基础课程设计 C语言 设计报告 题目:完整的二维迷宫游戏 学院:工商管理学院 专业:信息系统与信息管理 班级:050507 姓名:孙月 指导教师:张首伟 设计日期:2004年12月10日 题 ...

  7. c语言八个方向迷宫课程设计,【精品资料最新版】C语言课程设计-迷宫游戏.doc...

    计算机技术基础课程设计 C语言 设计报告 题目:完整的二维迷宫游戏 学院:工商管理学院 专业:信息系统与信息管理 班级:050507 姓名:孙月 指导教师:张首伟 设计日期:2004年12月10日 题 ...

  8. 数据结构课程设计——迷宫问题课程设计报告

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

  9. 课程设计—C++实现高斯消元法求解线性方程组Ax=b(附源码)

    (一)需求和规格说明 输入是 N(N<256) 元线性方程组 Ax=B, 输出是方程组的解,也可能无解或有多组解.可以用高斯消去法求解,也可以采用其它方法. 要求给出线性方程组的矩阵,能够输出线 ...

  10. 数据结构课程设计 迷宫问题

    文章目录 一. 目的与要求 二. 问题描述和求解方法 三. 解题过程 四. 实现源码 五. 相关案例 案例一 案例二 一. 目的与要求 1.目的: 通过布置具有一定难度的实际程序设计项目,使学生进一步 ...

最新文章

  1. python实现Anderson-Darling正态分布检验
  2. 关注:诺奖得主被爆40多篇论文P图造假!涉及国内“杰青”
  3. c语言goto语句用法_硬件工程师必知的10个C语言技巧
  4. cocos2dx 圆盘抽奖_cocoscreator之微信小游戏的抽奖转盘
  5. Android Studio出现R.raw文件标红找不到错误(有多个模块的Project)
  6. Linux下内存使用率、CPU使用率、以及运行原理-转
  7. 51nod 1435 位数阶乘
  8. webGL学习笔记一
  9. php商城拍卖逻辑,thinkphp商城购物车逻辑思路
  10. 网络工程师(软考中级-华为认证)
  11. 手机java时代浏览器_巅峰之战 三款最热java手机浏览器横评
  12. 【战术性mark】JS 复制内容到剪贴板
  13. 【Java】设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。
  14. React-Native: bios打开VT-x选项
  15. 方舟服务器显示等待发布,《明日方舟》开服既炸服的这波操作《方舟生存进化》永远也学不会...
  16. php手机网页_如何制作手机网页?
  17. 2023 上海(深圳)国际导热散热材料及设备展览会
  18. 诗经 - 小雅 - 吉日
  19. 《统计学基础》——第四章(朴素贝叶斯)
  20. BluetoothOpp共享文件(一)之蓝牙设备选择

热门文章

  1. FM5012D小风扇集成ic方案
  2. ICA算法-盲源分离
  3. 李琦自曝女儿不是亲生 但丝毫不影响家庭的美满幸福
  4. frontpage css,在Frontpage 中定义网页CSS样式
  5. 另类的手机壁纸!壁纸颜色像变色龙一样随环境变化而变色!好喜欢!
  6. 批处理-type命令
  7. 西邮计算机网络实验报告,西邮计算机网络实验报告内容模板-实验二-交换机基本配置...
  8. 我的P4B533主板集成声卡驱动
  9. linux国产操作系统下载网站,三分钟快速安装国产操作系统Ylmf OS
  10. 2017全国计算机ps版本,Adobe Photoshop v18.0.0 (PS CC 2017) 中文多语言版本 不断更新