求迷宫从入口到出口的所有路径是一个经典的程序设计问题。一般的设计思想就是从入口出发,顺着某个方向向下探索,探索分为上下左右四个方位,哪个方向是通的就将向下走,如果每个方向都走不下去就进行原路“回退”。所以需要一个后进先出的结构来保存从入口到出口的路径。所以运用栈来实现是非常方便的,沿着某个方向走,将每个可通的位置进行入栈标记,再切换到下个位置;如果都不通,则栈顶出栈取消标记,再寻找。下来呢就实现一个简单的迷宫求解问题(求解出一条通路就好),至于求解多条通路并且求出最短路径的问题呢我还在进一步的学习中。
凭借整站使用H5开发的创新体验、定制设计、设计团队积累与透明式的服务过程,符合行业特点,专属顾问根据企业产品,消费群体属性,准确定位;设计师以目标客户为中心,以突出品牌官网特性为宗旨,定制专属网站建设设计方案。在给出代码之前先来看一下如何动态开辟一个二维数组?
int *a = new int[N*N]; int** a=new int*[N]; //a[i][j] 等价于 a[i*N + j];
好了,现在来看迷宫的具体实现:
#define _CRT_SECURE_NO_WARNING #pragma once #include#include #include using namespace std; #define N 10 struct Pos { Pos(size_t row, size_t col) :_row(row) , _col(col) {} int _row; int _col; }; void GetMaze(int *a,int n)//读入文件 { FILE* fout = fopen("MazeMap.txt", "r"); assert(fout); for (int i = 0; i < n; i++) { for (int j = 0; j < n;) { char ch = fgetc(fout); if ('0' == ch || '1' == ch) { a[i*n + j] = ch - '0'; j++; } else { continue; } } } fclose(fout); } void PrintMaze(int* a,int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << a[i*n + j]<<" "; } cout << endl; } } bool CheckIsAccess(int* a, int n, Pos next) { assert(a); if ((next._row >= 0) && (next._row < n) && (next._col >= 0) && (next._col < n)&&(a[next._row*n+next._col]==0)) { return true; } else { return false; } } bool MazePath(int* a, int n, const Pos& entry, stack & path) { Pos cur = entry;//入口位置 path.push(cur); while (!path.empty()) { //是否已经到出口 if (cur._row == n - 1) { a[cur._row*n + cur._col] = 2; return true; } a[cur._row*n + cur._col] = 2; //*****************************************上 Pos next = cur; next._row--; if (CheckIsAccess(a, n, next)) { cur = next; path.push(cur); continue; } //*****************************************下 next = cur; next._row++; if (CheckIsAccess(a, n, next)) { cur = next; path.push(cur); continue; } //*****************************************左 next = cur;//左 next._col--; if (CheckIsAccess(a, n, next)) { cur = next; path.push(cur); continue; } //*****************************************右 next = cur; next._col++; if (CheckIsAccess(a, n, next)) { cur = next; path.push(cur); continue; } cur = path.top();//到这说明没有通路,所以栈顶出栈 path.pop(); } return false; } void TestMaze() { int a[N][N] = {}; GetMaze((int *)a,N); PrintMaze((int *)a, N); stack path; Pos entry = { 2, 0 }; bool ret = MazePath((int *)a, N, entry, path); cout << "是否有通路?" << ret << endl; PrintMaze((int *)a, N); }
当迷宫有多个出口时,利用全局栈可以求得最短路径。这个我们下次再议
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。