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步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著是用廣...