這裡的迷宮問題是將乙個二位陣列看作是迷宮,裡面的數值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,後續通路的值依次遞增。
接下來看getshortpath(cur, path, shortpath),用棧輔助完成遞迴探測,cur為當前座標,path為尋找通路時用到的棧,shortpath則是最終要的最優解所在的棧。bool checkisaccess(pos cur, pos next)//判斷是否可以通(0是通路,而比cur大的值也可以通)
return
false;
}
從入口處開始入棧path並標記入口處的位置,然後探測這個座標周圍的通路併入棧、標記,入棧之後它就是新的入口……
下面是測試用的**,這裡入口為(2,0),設定了四個出口分別為(7,0)(9,5)(9,8)(7,9),最優解是(7,0)處出來,長度為10void 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;
}
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.一般來說題目中需要求解出最優解的問題,我們是可以使用普通遞迴,遞推,深度優先搜尋,記憶型的遞迴,貪心或者動態規劃來進行求解的 其中使用普通的遞迴或者深搜,遞推這些資料量較小的情況下求解速度還行,假如資料量相對大一點的情況下,而且節點的數量比較多,這個時候使用這些方法來解決往往會耗時比較大,有時候...