求迷宮從入口到出口的所有路徑是一個經(jīng)典的程序設(shè)計問題。一般的設(shè)計思想就是從入口出發(fā),順著某個方向向下探索,探索分為上下左右四個方位,哪個方向是通的就將向下走,如果每個方向都走不下去就進(jìn)行原路“回退”。所以需要一個后進(jìn)先出的結(jié)構(gòu)來保存從入口到出口的路徑。所以運(yùn)用棧來實現(xiàn)是非常方便的,沿著某個方向走,將每個可通的位置進(jìn)行入棧標(biāo)記,再切換到下個位置;如果都不通,則棧頂出棧取消標(biāo)記,再尋找。下來呢就實現(xiàn)一個簡單的迷宮求解問題(求解出一條通路就好),至于求解多條通路并且求出最短路徑的問題呢我還在進(jìn)一步的學(xué)習(xí)中。
站在用戶的角度思考問題,與客戶深入溝通,找到五原網(wǎng)站設(shè)計與五原網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋五原地區(qū)。
在給出代碼之前先來看一下如何動態(tài)開辟一個二維數(shù)組?
int *a = new int[N*N]; int** a=new int*[N]; //a[i][j] 等價于 a[i*N + j];
好了,現(xiàn)在來看迷宮的具體實現(xiàn):
#define _CRT_SECURE_NO_WARNING #pragma once #include<iostream> #include<stack> #include<assert> 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<Pos>& path) { Pos cur = entry;//入口位置 path.push(cur); while (!path.empty()) { //是否已經(jīng)到出口 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<Pos> path; Pos entry = { 2, 0 }; bool ret = MazePath((int *)a, N, entry, path); cout << "是否有通路?" << ret << endl; PrintMaze((int *)a, N); }
當(dāng)迷宮有多個出口時,利用全局??梢郧蟮米疃搪窂健_@個我們下次再議
文章名稱:棧求解迷宮問題
分享地址:http://jinyejixie.com/article4/jjheoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、App設(shè)計、面包屑導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)