簡單迷宮最優解問題

2021-08-09 01:47:27 字數 2528 閱讀 8591

這裡的迷宮問題是將乙個二位陣列看作是迷宮,裡面的數值1為牆,是死路,而0則是通路。

例如下圖之中,(1,0)是迷宮入口,紅線部分為一條迷宮通路,而後面的黑色圓圈圈住的部分就是乙個死胡同

而在乙個迷宮之中,是會有多條路徑可以走出迷宮,今天的任務就是要找到最短的那條路徑。

求解迷宮出口的演算法是使用遞迴,從入口進入迷宮,然後從入口的上右下左(順時針方向,方向可自定義)四個方向探測,探測到下乙個位置是通路時可以走,將來時的路做標記 ,並將下乙個點變成新的入口(遞迴子問題), 以此類推,便可以找到所有通路。

struct pos    //用於儲存迷宮位置的行列 

;template

class maze

void print();//用於顯示

bool checkisaccess(pos cur, pos next);//判斷是否可以通

void getshortpath(pos cur, stack

& path, stack

& shortpath);//標記、尋找通路以及判斷最優解

~maze()

{}protected:

int _maze[m][n];

};

利用這幾個函式就可以完成所有工作,乙個個來看

首先用於顯示的print()函式就是二位陣列的顯示方法,而checkisaccess(cur,next)中,cur為當前的座標位置,nxet為下乙個座標位置,也是需要判斷的位置。當next處的值為0(最原始通路為0)是,肯定可以通過,而標記過後0值被改變,但不影響他的通過性。這裡標記放法是在入口處將0換為2,後續通路的值依次遞增。

bool checkisaccess(pos cur, pos next)//判斷是否可以通(0是通路,而比cur大的值也可以通)

return

false;

}

接下來看getshortpath(cur, path, shortpath),用棧輔助完成遞迴探測,cur為當前座標,path為尋找通路時用到的棧,shortpath則是最終要的最優解所在的棧。

從入口處開始入棧path並標記入口處的位置,然後探測這個座標周圍的通路併入棧、標記,入棧之後它就是新的入口……

void getshortpath(pos cur, stack

& path, stack

& shortpath)

else

if ((path.size()>1)&&(cur._row == m - 1 || cur._col == n - 1 || cur._row == 0 || cur._col == 0))//已到出口位置

}//後面向四周探測為遞迴的子問題

pos next = cur;//每次探測乙個方向之前回到當前cur的位置

next._row -= 1;//探測cur上方

if (checkisaccess(cur, next))

next = cur;

next._col += 1;//探測cur右方

if (checkisaccess(cur, next))

next = cur;

next._row += 1;//探測cur下方

if (checkisaccess(cur, next))

next = cur;

next._col -= 1;//探測cur左方

if (checkisaccess(cur, next))

if (!path.empty())

return;

}

下面是測試用的**,這裡入口為(2,0),設定了四個出口分別為(7,0)(9,5)(9,8)(7,9),最優解是(7,0)處出來,長度為10

void testmaze()

, ,

, ,

, ,

, ,

, };

maze<10,10> mz((int*)maze);

mz.print();

pos cur = ;

stack

path, shortpath;

mz.getshortpath(cur, path, shortpath);

mz.print();

if (shortpath.size() == 0)

else

cout

<< "最短路徑為:"

測試結果,找到了所有出口,並且也找到了最優解

下面將所有出口堵死,只給乙個入口,沒有找到出口,程式沒有掛掉

最優解問題

最優解問題題型隱晦 變化多端,所以總結此類題目的特徵 解法歸類有助於我們更快的想到這類題目的解題方法 佔坑!後續補充 最優解題目特徵 解題思路1 貪心思想 例題 九度oj題目1434 今年暑假不ac 分析過程 乙個節目提供了三個引數 開始時間 結束時間 持續時間。思考開始最早的元素是不是第乙個最優解...

最優解問題

新龜兔賽跑 要求烏龜到達終點的最優解,無非就是貪心,dp,和bfs,dfs.等等方法了,貪心已經排除了,因為我發現,開始的時候我只是把倒數第乙個站點作為終點去考慮,題目中給的測試資料只有三個,當讓是能過的,但是當站點比這多時,這樣做就行不通了,我們只有把每個站點都作為一次終點去考慮,求烏龜到改點時的...

最優解問題的求解

1.一般來說題目中需要求解出最優解的問題,我們是可以使用普通遞迴,遞推,深度優先搜尋,記憶型的遞迴,貪心或者動態規劃來進行求解的 其中使用普通的遞迴或者深搜,遞推這些資料量較小的情況下求解速度還行,假如資料量相對大一點的情況下,而且節點的數量比較多,這個時候使用這些方法來解決往往會耗時比較大,有時候...