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

原创 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;
}

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

栈的应用之迷宫问题

1、

栈应用----迷宫问题

1

栈的应用——求解迷宫问题

问题描述: 给定一个M×N的迷宫图,求一条从指定入口到出口的路径。假设迷宫图如图所示(M=10,N=10),其中的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。要求所求路径必须是...

数据结构之 栈应用---老鼠迷宫问题

老鼠迷宫问题是栈应用问题的一个入门,通过对满足要求的迷宫位置压栈,同时,将位置置为不可用,来实现对从迷宫入口到出口的路径寻找(非最优路径)。 下面是关键的代码:#include "myMatrix....

迷宫问题——堆栈应用(C++版)

1.设计一个坐标类: class mazepoint { friend class mazestack; public: mazepoint(){} mazepoint(int a, int ...

栈的应用——迷宫求解问题

/* 利用栈求解迷宫问题(只输出一个解,算法3.3) */ typedef struct /* 迷宫坐标位置类型 */ { int x; /* 行值 */ int y; /* 列值 ...

栈的应用-迷宫问题-数据结构

栈的基本应用之一,解决迷宫问题,主要是利用栈的递归作用。 就是个搜索加回溯,写了两遍,第一遍小问题调到两点没调试出来,第二天干脆重新写了,一次就出来了。 后面几个例子运行了下没什么问题,可能有些问...

求解:栈的应用 深度优先搜索:迷宫问题

假设迷宫是一个n行n列的二维平面表格,左上角作为迷宫的入口,右下角作为迷宫的出口。 例如:可以用一个10×10的矩阵maze[10][10]来表示四周为墙的8×8迷宫,矩阵的元素为0或1,0表示通路...

C语言 迷宫问题求解(顺序栈应用示例)

[cpp] view plaincopy //顺序栈的应用:迷宫   //作者:nuaazdh   //时间:2011年12月7日   #include    #...
  • csshuke
  • csshuke
  • 2015年11月05日 11:42
  • 478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初级版迷宫问题(栈的应用)
举报原因:
原因补充:

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