迷宫算法——验证迷宫的可通性
【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
總結
以上是生活随笔為你收集整理的迷宫算法——验证迷宫的可通性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware Workstation卸载
- 下一篇: 企业级控件库之大数据量分页控件 (非原创