日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迷宫算法——验证迷宫的可通性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【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;
}

由于該功能只是為了滿足是否有出口無需判斷出口路線,如果需要有出口路線,則在迷宮節點添加一個指向前面節點的指針,然后用反向找到迷宮路徑。

該功能比較簡單,所以直接上代碼了,見諒。

轉載于:https://www.cnblogs.com/qboy/p/4115302.html

總結

以上是生活随笔為你收集整理的迷宫算法——验证迷宫的可通性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。