對於迷宮最優路徑,其中之一方法就是把所有路徑都找出來如下:
1 1 * * *
* 1 * * *
* 1 * * *
* 1 1 1 1
* 1 * * 1 對於這樣的迷宮,從(0 0)到(4 4)所有路徑有(00)(01)(11)(21)(31)(41)(31)(32)(33)(34)(44)以及
(00)(01)(11)(21)(31)(32)(33)(34)(44) 這樣在一條路徑重複走同一節點,這樣浪費了空間也同時浪費了時間。
當然求解迷宮的最優路徑肯定需要重複走同一節點,但是對於每條路徑是沒有重複節點。換個方式從整體和區域性上看,整體就是所有能從起點到終點的路徑,區域性就是整體中的每一條路徑。對於整體是有重複節點,而在區域性上是沒有重複節點的。
這樣我們可以給每個點也就是(1或者*)給個value,初始都為零。這樣每走一步就加一,這樣就記錄了你走過的路徑。同時走的路徑只能朝著大數走或者是未走過的並且能走的路。這樣就即保證了在單一條路徑上沒有走重複路,同時在其他路徑可以重複走之前走過的節點。
#include "iostream"
#include "cstddef"
#include using namespace std;
struct point;
};//點的位置
int direct[4][2] = ;//四個方向
templateclass mazepath;
templatemazepath::mazepath(size_t x , size_t y , t w): width(x) , height(y) , wall(w)
}templatevoid mazepath::push_back(t data , size_t x , size_t y)
templatevoid mazepath::printmaze()
for(int i = 0; i < this->height; ++ i)
}templatebool mazepath::iscango(size_t nx , size_t ny , size_t prepoint)
templateint mazepath::optimalpath(point& start , point& end , vector& path)
for(int i = 0; i < 4; ++ i)
}return 0;
}int main()
}_maze.printmaze();
point start(0 , 0) , end(8 , 8);
vectorpath;
_maze.optimalpath(start , end , path);
_maze.printmaze();
return 0;
}
結果圖如下:
A (最優路徑)
尋路 尋找最短路徑並避開障礙物 首先將地圖虛擬化,將地圖劃分為乙個乙個的小方塊,這樣可以用二維陣列來表示地圖。如下所示,綠色塊 a 是起點,紅色塊 b 是終點,中間藍色塊是障礙物,白色塊是空地。先羅列出所有的步驟,等會按照例子一步一步分析 1 尋路步驟 步驟1.從起點a開始,把a作為乙個等待檢查的方...
在探迷宮 2 迷宮路徑之最優解 帶環或不帶環
迷宮問題 1 課程設計之簡單實現 只找出一條通路即可 因為迷宮問題需要用到棧,所以貼出棧的相關操作的鏈結 棧的基本操作 棧的相關面試題總結 迷宮地圖的分類 大概有三種 第一類 乙個入口 entry 乙個出口 exit 而且通路不帶環,只有一條通路。思路 首先,將入口座標壓入棧中,確定棧頂元素入口座標...
最優對稱路徑
湖南省第七屆大學生計算機程式設計競賽 the seventh hunan collegiate programming contest 題目g最優對稱路徑 給乙個n行n列的網格,每個格仔裡有乙個1到9的數字。你需要從左上角走到右下角,其中每一步只能往上 下 左 右四個方向之一走到相鄰格仔,不能斜著走...