初级版迷宫问题(栈的应用)

原创 2016年06月01日 00:05:24
 
/*
 (一)初级迷宫问题:
  0:代表通
  1:代表不通
  求迷宫的通路
 (二)步骤:
  1.创建迷宫
     * 从文件中读取迷宫
     * 开辟二维数组存放迷宫
  2.寻找通路
     * 检查某位置是否为通
     * 出口位置判断
     * 走过的路用2标记
     * 利用栈回溯
 (三)问题
  1.解决回溯中重复探测:递归
  2.最优解:迷宫的最短通路
*/

#include <iostream>
#include <stdlib.h>
#include <assert.h>
#include <stack>
#define _CRT_SECURE_NO_WARNINGS 1
#define N 10
using namespace std;
struct Pos
{
 size_t _row;  //行
 size_t _col;  //列
};
void GetMap(int* m, int n)
{
 int i = 0;
 int j = 0;
 assert(m);
 FILE* fin = fopen("C:\\学习\\code\\数据结构\\MazeMap\\MazeMap.txt","r");
 assert(fin);
 for(i = 0; i < n; i++)
 {
  for(j = 0; j < n;)
  {
   char ch = fgetc(fin);
   if(ch == '0'||ch == '1')
   {
    m[i*n+j] = ch - '0';
    j++;
   }
  }
 }
}
void PrintMap(int* m, int n)
{
 assert(m);
 int i = 0;
 int j = 0;
 for(i = 0; i < n; i++)
 {
  for(j = 0; j < n; j++)
  {
   cout<<m[i*n+j]<<' ';
  }
  cout<<endl;
 }
}
bool CheckIsAccess(int* m, int n, const Pos& next)
{
 if(next._row >= 0 && next._row < n 
  && next._col >= 0 && next._col < n
  && m[next._row*n+next._col] == 0)
 {
  return true;
 }
 else
 {
  return false;
 }
}
bool SearchMazePath(int* m, int n, Pos enrty,stack<Pos> paths)
{
 assert(m);
 paths.push(enrty);
 while(!paths.empty())
 {
  Pos cur = paths.top();
  m[cur._row * n + cur._col] = 2;
  //检查是否找到出口
  if(cur._row == n-1)
  {
   return true;
  }
  Pos next = cur;
  //上
  next._row--;
  if(CheckIsAccess(m, n, next))
  {
   paths.push(next);
   continue;
  }
  next = cur;
  //右
  next._col++;
  if(CheckIsAccess(m, n, next))
  {
   paths.push(next);
   continue;
  }
  next = cur;   //next归位
  //下
  next._row++;
  if(CheckIsAccess(m, n, next))
  {
   paths.push(next);
   continue;
  }
  next = cur;
  //左
  next._col--;
  if(CheckIsAccess(m, n, next))
  {
   paths.push(next);
   continue;
  }
 
  paths.pop();
 }
 return false;
}
int main()
{
 int map[N][N]= {0};
 GetMap((int*)map, N);
 PrintMap((int*)map, N);
 Pos enrty = {2,0};
 stack<Pos> paths;
 cout<<endl;
 cout<<SearchMazePath((int*)map,N,enrty,paths);
 cout<<endl;
 PrintMap((int*)map, N);
 system("pause");
 return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构--用栈求解迷宫问题(非最优解)

数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦。 BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点...
  • huangyong000
  • huangyong000
  • 2016年05月09日 18:57
  • 3595

栈求解迷宫问题

问题:假设下图是某迷宫的地图,问此迷宫是否有一条通路 求解思想: 用栈来实现解决问题,主要步骤是 (1)从迷宫的...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016年04月11日 23:16
  • 3409

以栈解决迷宫问题

怎么找到一个迷宫的出口呢。首先要知道迷宫长啥样,之后知道出入口,再之后就是找通路的过程了。     显然主要的部分是如何找通路。我们就举一个例子:     在这个迷宫中0就是墙,1就是路...
  • A_stupid_dog
  • A_stupid_dog
  • 2016年06月23日 16:23
  • 3361

用栈和递归求解迷宫问题

一、问题概述 小时候,我们都玩过走迷宫的游戏吧。看一下这个图例: 遇到这种问题时,我们第一反应都会先找到迷宫的入口点,然后对上下左右四个方向进行寻迹,  检测当前位置是否是通路,是否可以...
  • xxpresent
  • xxpresent
  • 2016年11月30日 21:27
  • 2024

【数据结构】使用栈Stack解决迷宫问题

我们看下面这个迷宫----方阵(也可以是矩阵):650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/7E/E9/wKiom1cMngag...
  • hanjing_1995
  • hanjing_1995
  • 2016年05月30日 17:18
  • 581

数据结构(C语言版)”栈与队列“章节迷宫求解问题的思路与实现

迷宫求解问题来源自”数据结构(C语言版)“一书第50页的例题。该例题要求在不使用递归(因为暂时还没讲到),只能通过使用诸如入栈出栈的方式获取一条可以走出迷宫的路径。     在看完文字提示后,我就没有...
  • u010676110
  • u010676110
  • 2015年05月11日 18:51
  • 2247

数据结构:栈的应用(迷宫的求解)

/********************************************************** 程序:迷宫实现 作者:小单 完成时间:2013年...
  • s634772208
  • s634772208
  • 2015年05月08日 13:55
  • 878

运用栈求解迷宫问题C/C++

用栈解决基本的迷宫问题C/C++ 1、问题描述:设置迷宫为m*n的二维数组,起点坐标为(1,1),中点坐标为(m,n),0为通路,1为死路,为防止数组越界将四周设置边界1,即数组变为(m+2)*(n...
  • g15827636417
  • g15827636417
  • 2016年10月07日 16:18
  • 4984

数据结构(7)—栈的应用之迷宫求解

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社 1.问题描述: 采用“穷举求解”方法,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向再继续探索。为...
  • u010366748
  • u010366748
  • 2016年02月21日 01:23
  • 926

【栈和队列】栈和队列的基本应用(C++版)

【栈和队列】栈和队列的应用(C++版)
  • u012771236
  • u012771236
  • 2014年05月23日 14:11
  • 1917
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初级版迷宫问题(栈的应用)
举报原因:
原因补充:

(最多只允许输入30个字)