奇怪的電梯(深搜dfs)

2021-10-05 17:22:18 字數 1502 閱讀 7722

description

有一天uncle-lu做了乙個夢,夢見了一種很奇怪的電梯。

大樓的每一層樓都可以停電梯,而且i層樓上有乙個數字。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。

當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3,3,1,2,5代表了,從1樓開始。在1樓,按「上」可以到4樓,按「下」是不起作用的,因為沒有−2樓。

那麼,從a樓到b樓至少要按幾次按鈕呢?

input

第一行為3個用空格隔開的正整數,表示n,a,b。

第二行為n個用空格隔開的非負整數,表示ki。

output

一行,即最少按鍵次數,若無法到達,則輸出−1。

sample input 1

5 1 5

3 3 1 2 5

sample output 1

3hint

1≤n≤200,1≤a,b≤n

time limit

1000ms

memory limit

256mb

#include

#include

int n,a,b;

//樓層數、起始樓、目標樓

int step[

201]

;//樓層對應數字

int ans=

0xfffffff

;//答案,因為是找最小值,所以置個足夠大的數

bool vis[

201]

=,flag=

false

;//標記已經到過的樓、可達性標記

void

dfs(

int floor,

int cnt)

//樓層,按按鈕次數(路徑長度)

if(floor==b)

//搜尋,仍然需要注意:先判斷陣列越界再判斷重複訪問

//n是樓頂,不能再往上了

if(floor+step[floor]

<=n &&

!vis[floor+step[floor]])

//沒有0樓,不能再往下了

if(floor-step[floor]

>0&&

!vis[floor-step[floor]])

//列舉完就退

return;}

intmain()

vis[a]

=true

;//先行給初始樓層標記

dfs(a,0)

;//傳入初始狀態if(

!flag)

else

printf

("%d"

,ans)

;return0;

}

DFS 奇怪的電梯

奇怪的電梯 有一天桐桐做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓 1 i n 上有乙個數字k 0 ki n 電梯只有四 個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如 3 3 1 2 5代表了ki k1 ...

dfs 深搜 模板

關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用的搜尋分支。有可行性剪枝和最優性剪枝兩種。int mx 4 向上下左右四個方向移動 0,1 0,1 1,0 1,0 int my 4 bool check int x,int y 判斷是否滿足條件的子...

深搜DFS和廣搜BFS

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著是用廣...