码迷,mamicode.com
首页 > 编程语言 > 详细

(算法)广度寻路

时间:2018-04-08 22:26:39      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:ace   大小   style   准备   标记   data   std   while   sch   

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 
  5 #define MAP_ROW 6
  6 #define MAP_COL 8 //定义寻路地图的大小,可以修改,自定义
  7 
  8 enum PathDir{//地图点的方向 
  9     p_up, p_down, p_left, p_right
 10 }; 
 11 struct MyPos{//地图中点的坐标
 12     int row, col; 
 13 };
 14 struct PathData{//寻路辅助信息 
 15     PathDir dir;
 16     int val;    //地图数组元素值,0, 1分别表示是有路,有障碍物
 17     bool isFind; //该点是否被访问过 
 18 };
 19 struct MyPathNode{//树形结构中的节点类型
 20     MyPos pos;//坐标
 21     MyPathNode *pParentNode; //父节点
 22     vector<MyPathNode *> childNode;//动态指针数组,用来查找所有的子节点 
 23 };
 24 //判断point点在地图中 是否可以通行,是否可以被访问 
 25 bool isCheckPoint(MyPos const& point, PathData pArr[][MAP_COL]){
 26     bool isCheck = false;    //认为每一个点都是不可通行的,不能被访问
 27     
 28     //没有越界,在地图范围内
 29     if(point.row >= 0 && point.row < MAP_ROW && point.col >= 0 && point.col < MAP_COL){
 30         //可通行为0值, 没有被访问过false 
 31         if(pArr[point.row][point.col].isFind == false && pArr[point.row][point.col].val == 0)
 32             isCheck = true;//认为这个点可以访问和通行 
 33     } 
 34     return isCheck;
 35 }
 36 
 37 int main(){
 38     int arr[MAP_ROW][MAP_COL] = {//地图数组,0表示可以通行,1表示不能通行 地图可以修改 自定义 
 39         { 0, 0, 0, 0, 0, 0, 0, 0 },
 40         { 0, 0, 0, 0, 0, 0, 0, 0 },
 41         { 0, 0, 0, 0, 0, 0, 0, 0 },
 42         { 0, 0, 0, 0, 0, 0, 0, 0 },
 43         { 0, 0, 0, 0, 0, 0, 0, 0 },
 44         { 0, 0, 0, 0, 0, 0, 0, 0 }
 45     };
 46     PathData pathArr[MAP_ROW][MAP_COL];//寻路辅助数组
 47     for(int i = 0; i < MAP_ROW; ++i){//辅助数组初始化 
 48         for(int j = 0; j < MAP_COL; ++j){
 49             pathArr[i][j].dir = p_up;
 50             pathArr[i][j].val = arr[i][j];
 51             pathArr[i][j].isFind = false;
 52         }
 53     }
 54     MyPos beginPos = {1, 1}; //寻路起点坐标 
 55     MyPos endPos = {5, 7} ;    //寻路终点坐标 
 56     pathArr[beginPos.row][beginPos.col].isFind = true;//起点标记为已访问
 57     
 58     //定义根节点
 59     MyPathNode *pRoot = NULL;
 60     pRoot = new MyPathNode;
 61     pRoot->pos = beginPos;
 62     pRoot->pParentNode = NULL;
 63     
 64     //定义一个正准备搜索的指针数组,把根节点压入这个搜索的序列
 65     vector<MyPathNode *> nodeList;
 66     nodeList.push_back(pRoot); 
 67     
 68     //定义一个下次待搜索的指针数组,用来保存当前节点的所有子节点
 69     vector<MyPathNode *> tempNodeList;
 70     MyPos tempPos;//临时坐标,用来记录待搜索节点的坐标,用来判断在这个坐标能否通行
 71     
 72     while(true)//循环都少层数找到终点,或者没有路径
 73     {
 74         bool isFind = false;//定义一个标记,是否找到终点,true找到,跳出所有循环
 75         for(int i = 0; i < (int)nodeList.size(); ++i){//循环查找待搜索数组里面的所有节点 
 76             for(int j = 0; j < 4; ++j){//循环判断每一个节点的4个方向 
 77                 tempPos = nodeList[i]->pos;//得到到搜索的起始坐标
 78                 switch(j){
 79                     case p_up:
 80                         tempPos.row--;
 81                         break;
 82                     case p_down:
 83                         tempPos.row++;
 84                         break;
 85                     case p_left:
 86                         tempPos.col--;
 87                         break;
 88                     case p_right:
 89                         tempPos.col++;
 90                         break;
 91                 }
 92                 if(isCheckPoint(tempPos, pathArr)) {//条件满足证明可以通行 
 93                     MyPathNode *pNode = new MyPathNode;//构造一个新的节点,将作为当前节点的子节点存在 
 94                     pNode->pos = tempPos;
 95                     pNode->pParentNode = nodeList[i];//构造父关系
 96                     
 97                     nodeList[i]->childNode.push_back(pNode);//父节点去构造子节点
 98                     tempNodeList.push_back(pNode);//把子节点的指针压入下一次待搜索的容器
 99                     pathArr[tempPos.row][tempPos.col].isFind = true;
100                     if(tempPos.row == endPos.row && tempPos.col == endPos.col){
101                         //找到终点
102                         isFind = true;
103                         MyPathNode *tempNode = pNode;
104                         while(tempNode){
105                             printf("row = %d\t col = %d\n", tempNode->pos.row, tempNode->pos.col);
106                             tempNode = tempNode->pParentNode;
107                         } 
108                         break;
109                     } 
110                 }
111             }
112             if(isFind) break;
113         }    
114         if(isFind) break;
115         if(tempNodeList.size() == 0) break;//证明没有路, 结束死循环 
116         nodeList = tempNodeList;
117         tempNodeList.clear();
118     } 
119     while(1);
120     
121     return 0;
122 }

 

(算法)广度寻路

标签:ace   大小   style   准备   标记   data   std   while   sch   

原文地址:https://www.cnblogs.com/Ljh578519469/p/8747570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!