動態路徑規劃(一)

2021-07-05 06:33:05 字數 1802 閱讀 2854

## 森林裡的苯苯熊要喬遷新喜,上次他已經將物品打包完成,並約了朋友來幫忙。接下來他要選定乙個搬家的時間,想了很久,就決定在國慶節進行,因為國慶放假朋友們都有時間啦。但是在森林裡,從他現在房子到新豪宅,所經之地有山有水,路途曲折,甚至有些道路是不通的。

請你和他一起檢視指定的地圖,看看從笨笨熊現在的房子到新宅之間,道路是否是暢通的呢?

地圖是r行、c列的矩陣,矩陣的每乙個格仔剛好是一天的行程。

矩陣由「b」、「-」、「#」、「h」四種字元成員組成,其中:

b:代表苯苯熊現在的房子;

h:代表笨笨熊新的豪宅;

-:代表可以通行的道路;

#:代表無法通過的障礙(高山、大河等);

此外,森林裡也有交通規則地:在任務位置,只能向「上、下、左、右」四個方向中的其中乙個方向行走。

執行時間限制: 無限制

記憶體限制: 無限制

輸入: 4 // r的數值

4 // c的數值,下面是地圖。

-##-

b–h

#-#-

輸出: y //代表道路可達

或 n //代表道路不通

樣例輸入: 1

5 -b-h#

樣例輸出: y

在乙個二維陣列中分別用raod[i][j]=0來表示到座標(i,j)點的道路不可通行和road[i][j]=1來表示到座標點(i,j)的道路是可通行的。同時,用乙個布林型二維陣列flag來標誌某點座標是否被訪問過,通過將road和flag以及座標點a和b作為引數,從起點位置開始進行迭代,分別從上、下、左、右四個方向遍歷所有座標點,同時標誌該點已經被訪問,不需要再訪問,若可以訪問到終點座標,則返回true,否則返回false。對於每個座標點都需要從上下左右四個方向迭代遍歷,每次迭代遍歷前都需要首先進行座標合法,該點是否已遍歷,已經該點是否可通行的判斷。

#include

#include

using

namespace

std;

static

int r,c;

static

int destx,desty;

bool findpath(int **road,int a,int b,bool **flag)

if(a+1

1][b]==0 && road[a+1][b]==1)

if(b-1>=0 && flag[a][b-1]==0 && road[a][b-1]==1)

if(b+1

1]==0 && road[a][b+1]==1)

return

false;

}int main()

for(int i=0; ifor(int j=0; jif(p[i][j]=='#')

road[i][j]=0;

else

if(p[i][j]=='-')

road[i][j]=1;

else

if(p[i][j]=='b')

else

if(p[i][j]=='h')

}/*除錯使用

動態規劃 一

在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...

動態規劃(一)

動態規劃的兩種常用形式 1 遞迴型 在函式中呼叫自身 優點 直觀,容易編寫 缺點 可能會因為遞迴層數太深導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說,比遞推型慢。2 遞推型 for迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...

動態規劃 (一)

對於動態規劃的學習總共進行了兩節課,到現在為止還是一頭霧水,雖然看懂了老師上課講的例題,但是做v judge的時候還是都不太會,我主要認為我只知道了動態規劃的基本思想,就是將乙個大的問題,分成若干個小問題,但與貪心演算法不同的是,動態規劃中的每乙個小問題之間都相互影響,在每一步都取得最優解,且在不斷...