标签: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