迷宫算法——验证迷宫的可通性

【Qboy原创】

记得在大学学习数据结构时就学过采用迭代方式可以判断一个迷宫是否有解无解甚至可以查找出所有的可能的出口。目前公司开发一个游戏需要玩家去搭建迷宫让其他玩家去闯迷宫的游戏,游戏其实很简单。但是有一个重点就是要验证玩家所搭建的迷宫是否可到达。好吧这就是我们接下去算法的需求。写下此文只是为了Mark过程。

  首先先创建必须的结构体

  (1)迷宫中所有的节点类型  

  typedef enum{
      EMPTY=0, //空白
      OBSTACLE, //障碍
      ENTER, //入口
      EXIT, //出口
    }MazeNodeType; //迷宫节点的类型

  根据不同的业务需求可能还涉及到其他的节点类型,这是最基础的类型。

  (2)迷宫节点:

  typedef struct
  {
    CCPoint location;//位置
    MazeNodeType nodeType;
  }MazeNode;

  (3)迷宫地图

  typedef struct
  {
    MazeNode** pMazeNode;//地图的节点
    int iMazeOrientation;//横向多少个
    int iMazeLongitudinal;//纵向

    MazeNode* pEnter;//入口

  }MazeMap;

  (4)定义走迷宫时的方向枚举

   typedef enum{
    UP = 0,//上
    LEFT,//左
    DOWN,//下
    RIGHT,//右
    MaxDirection
   } MazeDirection;//方向

  为了简单方便,定义了一个静态数组,描述每个方向中每个X、Y的变化值。

  static CCPoint pointDirection[]={ccp(0,1),ccp(-1,0),ccp(0,-1),ccp(1,0)};

  其次验证迷宫

bool checkMazeRoad(MazeMap& map, MazeNodeType selectType)
{
  CCAssert(map.pMazeNode!=NULL,"Map is NULL");
  CCAssert(map.iMazeOrientation>0,"Orientation must larger than 0");
  CCAssert(map.iMazeLongitudinal>0,"Longitudinal must larger than 0");
  std::stack<MazeNode*> sMazeNode;//未验证过的节点
  std::list<MazeNode*> lMazeNode;//已验证过的节点
  sMazeNode.push(map.pEnter);//入口进栈
  lMazeNode.push_back(map.pEnter);
  bool rtn = false;
  do
  {
    MazeNode* pnode = sMazeNode.top();
    sMazeNode.pop();

    for(int i = 0;i<MaxDirection&&!rtn;i++)//四个方向依次判断
    {
      int x = (int)(pnode->location.x+pointDirection[i].x);
      int y = (int)(pnode->location.y+pointDirection[i].y);

      if(x < 0 || x >= map.iMazeLongitudinal || y < 0 || y >= map.iMazeOrientation)
      {
        continue;//越界取下一个
      }

      MazeNode* newNode = &map.pMazeNode[x][y];
      std::list<MazeNode*>::iterator it = find(lMazeNode.begin(), lMazeNode.end(), newNode);
      if(it!=lMazeNode.end())//find 说明该点已经进行过判断或者还在栈中未处理不入栈
      {

        continue;

      }else{
        if(newNode->nodeType== selectType)//出口
        {
          rtn = true;
        }else if(newNode->nodeType==EMPTY){//空白点进栈便于下次检查
          lMazeNode.push_back(newNode);
          sMazeNode.push(newNode);
        }
      }
    }

  } while (sMazeNode.size()>0&&!rtn);//无出口或者已经找到出口
  return rtn;
}

由于该功能只是为了满足是否有出口无需判断出口路线,如果需要有出口路线,则在迷宫节点添加一个指向前面节点的指针,然后用反向找到迷宫路径。

该功能比较简单,所以直接上代码了,见谅。

时间: 2024-10-08 21:45:03

迷宫算法——验证迷宫的可通性的相关文章

Google资深工程师深度讲解Go语言

第1章 课程介绍   1-1 课程导读   1-2 安装与环境第2章 基础语法   2-1 变量定义   2-2 内建变量类型   2-3 常量与枚举   2-4 条件语句   2-5 循环   2-6 函数   2-7 指针第3章 内建容器   3-1 数组   3-2 切片的概念   3-3 切片的操作   3-4 Map   3-5 Map例题   3-6 字符和字符串处理   第4章 面向"对象"   4-1 结构体和方法   4-2 包和封装   4-3 扩展已有类型   4

数据结构与算法4: 经典问题之迷宫问题(Maze path)

数据结构与算法4: 经典问题之迷宫问题(Maze path) 写在前面 本节实践了教材[1][2]的两种经典迷宫算法.注意体会栈的运用.如果有改进意见请帮助我. 1.迷宫问题直观感受 下面给出迷宫问题的一个直观感受图,引入图只是为了帮助直观理解,这里不涉及OpenGL等其他绘图内容. 下图中棕色代表通道阻塞,白色代表可用通道,红色代表起始位置,绿色代表当前位置,黄色代表出口. (采用C++ 和OpenGL 绘制,目前是2D版本,3D版本有空时再补上) 迷宫1: 迷宫2: 2.迷宫算法 2.1 迷

hdu1269 迷宫城堡,有向图的强连通分量 , Tarjan算法

hdu1269 迷宫城堡 验证给出的有向图是不是强连通图... Tarjan算法板子题 Tarjan算法的基础是DFS,对于每个节点.每条边都搜索一次,时间复杂度为O(V+E). 算法步骤: 1.搜索到某一个点时,将该点的Low值标上时间戳,然后将自己作为所在强连通分量的根节点(就是赋值Dfn=Low=time) 2.将该点压入栈. 3.当点p有与点p'相连时,如果此时p'不在栈中,p的low值为两点的low值中较小的一个. 4.当点p有与点p'相连时,如果此时p'在栈中,p的low值为p的lo

迷宫问题代码

def valid(grid, x, y):     if x >= 0 and x < len(grid) and y >= 0 and y < len(grid[0]) and grid[x][y] == 1:         return True     else:         return False def walk(grid, x, y):     if x == len(grid)-1 and y == len(grid[0])-1:         print

Java数据结构之回溯算法的递归应用迷宫的路径问题

一.简介 回溯法的基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法.当搜索到某个结点.发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支:如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程:这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止. 该方法可以使用堆栈实现.也可以使用递归实现,递归实现的话代码比较简单,

走迷宫——C++ 算法实现

这两个看了几个不错的走迷宫算法,然后按照自己的方式写了一个实现,代码如下: MyMazeMap.cpp 1 #include <iostream> 2 #include <Windows.h> 3 #include "MazeMap.h" 4 #include "Mazer.h" 5 using namespace std; 6 7 const int SUCCESS = 0; 8 9 int main() 10 { 11 int map[8

PHP树生成迷宫及A*自己主动寻路算法

PHP树生成迷宫及A*自己主动寻路算法 迷宫算法是採用树的深度遍历原理.这样生成的迷宫相当的细,并且死胡同数量相对较少! 随意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自己主动寻路算法 完整代码已上传,http://download.csdn.net/detail/hello_katty/8885779 ,此处做些简单解释,还须要大家自己思考动手.废话不多说,贴上带代码 迷宫生成类: /** 生成迷宫类 * @date 2015-07-10 * @edit http://w

迷宫问题(bfs)

1 import java.util.LinkedList; 2 import java.util.Queue; 3 import java.util.Stack; 4 5 public class BFS 6 { 7 private static final int M=3;//代表行 8 private static final int N=3;//代表列 9 10 int destX=1; 11 int destY=0; 12 13 //int[][] maze={{0,0,1,1},{0

PHP树生成迷宫及A*自动寻路算法

PHP树生成迷宫及A*自动寻路算法 迷宫算法是采用树的深度遍历原理,这样生成的迷宫相当的细,而且死胡同数量相对较少! 任意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自动寻路算法 完整代码已上传,http://download.csdn.net/detail/hello_katty/8885779 ,此处做些简单解释,还需要大家自己思考动手.废话不多说,贴上带代码 迷宫生成类: /** 生成迷宫类 * @date 2015-07-10 * @edit http://www.l