1、问题描述

多年以来,迷宫问题一直是令人感兴趣的题目。实验心理学家训练老鼠在迷宫中寻找食物。许多神秘主义小说家也曾把英国乡村花园迷宫作为谋杀现场。计算机工作者也对迷宫感兴趣。因为它可以展现栈的巧妙应用。
首先考虑的是存储问题,最简单的方法当然是二维数组。用“0”表示阻断,用“1”表示通路。其次考虑移动方位问题,这里有八个方向,可由如下存储形式表达:
move[0].vert = -1; move[0].horiz = 0;  //0代表正北方
move[1].vert = -1; move[1].horiz = 1;  //1代表东北方
move[2].vert = 0; move[2].horiz = 1;  //2代表正东方
move[3].vert = 1; move[3].horiz = 1;  //3代表东南方
move[4].vert = 1; move[4].horiz = 0;  //4代表正南方
move[5].vert = 1; move[5].horiz = -1; //5代表西南方
move[6].vert = 0; move[6].horiz = -1; //6代表正西方
move[7].vert = -1; move[7].horiz = -1; //7代表西北方
typedef struct
{short int vert;     //相对纵坐标short int horiz;    //相对横坐标
}offsets;
下一位置可用如下形式表达:
下一个位置的行数 = 当前位置行数 + 移动方位纵坐标
next_row = stacks[num].row + move[movenum].vert;
下一个位置的列数 = 当前位置列数 + 移动方位横坐标
          next_col = stacks[num].col + move[movenum].horiz;
栈的数据结构为:
int const MAX_LENGTH = 100;
typedef struct
{int row;    //行int col;    //列int dir;    //下一步索引
}MazeStack;MazeStack stacks[MAX_LENGTH];  //栈结构

2、条件

①为了避免边界条件的检查,在迷宫周围加上一圈边界。

3、输出

输出从迷宫入口到出口的路径,以(row,col,next_move)形式表示。

4、源程序

#include <iostream>using namespace std;
int const MAX_LENGTH = 100;
typedef struct
{int row;    //行int col;    //列int dir;    //下一步索引
}MazeStack;MazeStack stacks[MAX_LENGTH];  //栈结构typedef struct
{short int vert;     //相对纵坐标short int horiz;    //相对横坐标
}offsets;void InitMove(offsets* move)    //初始化移动方位结构
{move[0].vert = -1;move[0].horiz = 0;  //0代表正北方move[1].vert = -1;move[1].horiz = 1;  //1代表东北方move[2].vert = 0;move[2].horiz = 1;  //2代表正东方move[3].vert = 1;move[3].horiz = 1;  //3代表东南方move[4].vert = 1;move[4].horiz = 0;  //4代表正南方move[5].vert = 1;move[5].horiz = -1; //5代表西南方move[6].vert = 0;move[6].horiz = -1; //6代表正西方move[7].vert = -1;move[7].horiz = -1; //7代表西北方
}void InitMazeStack(MazeStack* stacks)    //初始化栈
{for(int i = 0; i < MAX_LENGTH; i++){stacks[i].row = -1;stacks[i].col = -1;stacks[i].dir = -1;}
}void Maze1(int** maze,int n,int m)
{int num = -1;int next_row = 1;   //下一个位置的行数int next_col = 1;   //下一个位置的列数InitMazeStack(stacks);//初始化栈stacks[++num].row = 1;  //stacks[num].col = 1;    //(1,1)入栈maze[1][1] = 0; //将(1,1)置为已访问点offsets move[8];    //移动方位InitMove(move);     //初始化move数组int movenum;        //移动方位while(next_row != n || next_col != m)   //当下一个位置不是(n,m)时,循环{movenum = 0;    //初始化方位while(movenum < 8)  //试探法找下一个可行位置{next_row = stacks[num].row + move[movenum].vert;      //下一个位置的行数 = 当前位置行数 + 移动方位纵坐标next_col = stacks[num].col + move[movenum].horiz;     //下一个位置的列数 = 当前位置列数 + 移动方位横坐标if(maze[next_row][next_col])   //如果迷宫下一个位置为1{stacks[num].dir = movenum;            //当前栈顶元素存储下一个位置stacks[++num].row = next_row;stacks[num].col = next_col;     //下一个位置进栈maze[next_row][next_col] = 0;   //将下一个位置置为已访问点break;  //进入下一次循环}movenum++;}if(movenum == 8)    //当前位置没有找到下一个可行位置{num--;stacks[num].dir = -1;   //回溯}}for(int i = 0; i <= num; i++)cout << stacks[i].row << " "<< stacks[i].col << " " << stacks[i].dir << endl;;
}int main()
{int n = 5;  //迷宫行数int m = 5;  //迷宫列数int* maze[MAX_LENGTH];  //指针数组for(int i = 0; i < MAX_LENGTH; i++) //动态分配maze[i] =new int[MAX_LENGTH];for(int i = 0; i < MAX_LENGTH; i++)for(int j = 0;j < MAX_LENGTH; j++)maze[i][j] = 0;maze[1][1] = maze[1][2] = maze[1][4]= 1;maze[2][1] = maze[2][5] = 1;maze[3][2] = maze[3][3] = maze[3][5]= 1;maze[4][3] = 1;maze[5][4]= maze[5][5]= 1;
//    for(int i = 0; i < 7; i++)  //测试输出
//    {
//        for(int j = 0;j < 7; j++)
//            cout << maze[i][j] << " ";
//        cout << endl;
//    }//    int* mazes[100] =    //迷宫
//    {
//        0,0,0,0,0,0,0,
//        0,1,1,0,1,0,0,
//        0,1,0,0,0,1,0,
//        0,0,1,1,0,1,0,
//        0,0,0,1,0,0,0,
//        0,0,0,0,1,1,0,
//        0,0,0,0,0,0,0
//    };Maze1(maze,5,5);
}

5、待补充

迷宫问题的解决方式,不止栈这一种,待以后碰到相应的问题时,再用其他方法进行解决。

迷宫问题(栈解决)--2015年8月9日19:23:23v1.0版相关推荐

  1. 各种搜索算法比较--2015年7月26日16:42:45V1.0版

    1.顺序查找 int SequenceSearch(int a[],int n,int key) //顺序查找 {for(int i = 0; i < n; i++){if(key == a[i ...

  2. KMP算法(待优化)--2015年7月25日14:04:25V1.0版

    #include <iostream> #include <string> #include <cstring> using namespace std;void ...

  3. 简单的字谜游戏--可扩展--2015年7月25日14:58:00V1.1版

    1.string类find匹配法 #include <iostream> #include <string> #include <cstring> #include ...

  4. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

    day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复 ...

  5. 【历史上的今天】8 月 5 日:微信 5.0 发布;百度上市;LinkedIn 创始人诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 8 月 5 日,在 1930 年的今天,美国宇航员尼尔·奥尔登·阿姆斯特朗(Neil Alden A ...

  6. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(day01~day10)(2015年11月17日20:51:59)

    本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定 ...

  7. 2015年10月15日作业

    2015年10月15日作业 中级学员---徐化栋 一.项目质量管理作业 1. 项目质量规划的方法/技术和工具,并简要描述: 1) 效益/成本分析 2) 基准比较 3) 流程图 4) 实验设计 5) 质 ...

  8. WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)

    时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码)  已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主 ...

  9. 李宁-2015年7月13日-个人文档

    姓名 李宁 日期 2015年7月13日 主要工作及心得 由于我负责服务器端的编写工作,而各部分的客户端的操作都要与服务器端通信,所以在今天的调试中,我贯穿于各部分模块的调试和检测,主要负责在出现问题时 ...

最新文章

  1. 10月10号面试技术总结
  2. linux lvm管理实例,Linux系统管理之LVM案例
  3. 寒冷的高纬度——我的梦开始的地方
  4. 什么牌子的平板电脑好_台式电脑哪个牌子好
  5. Linux编程 3 (初识bash shell与man查看手册)
  6. LibreOJ #6207. 米缇(杜教筛 + 拉格朗日插值)
  7. 北航博士,研究所月入两万
  8. golang flag.Parse包
  9. python有趣的函数_Python中有趣在__call__函数
  10. 【白皮书分享】2021内容营销白皮书.pdf(附下载链接)
  11. ESP32c3开发环境搭建 IDF V4.4离线版安装使用
  12. php’s explode() 函数
  13. 清理注册表 php,cad注册表怎么删干净
  14. 基于ADS软件的阻抗匹配
  15. HTTP报文-请求方式
  16. 对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解
  17. android 怎么判断手机号是移动还是联通
  18. 1123581321递归算法java_经典算法设计方法
  19. HTML学生考勤界面代码,基于jsp的学生考勤系统-JavaEE实现学生考勤系统 - java项目源码...
  20. python average函数详解_Python内置函数详解——总结篇

热门文章

  1. 输入身份证号,输出出生日期
  2. C#LeetCode刷题之#40-组合总和 II(Combination Sum II)
  3. C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)
  4. JAVA对接支付宝支付(超详细,一看就懂)
  5. 如何在Windows上安装Angular:Angular CLI,Node.js和构建工具指南
  6. win10电子邮件没有关联_我们如何为在线课程建立10K电子邮件列表
  7. SQL相关子查询与非相关子查询
  8. Python实现进度条和时间预估的示例代码
  9. Linux 基础知识系列第二篇
  10. kafka 如何做到1秒发布百万级条消息?