演算法 跳石板問題(廣度優先搜尋)

2021-08-16 09:47:33 字數 1306 閱讀 7685

小易來到了一條石板路前,每塊石板上從1挨著編號為:1、2、3.......這條石板路要根據特殊的規則才能前進:

對於小易當前所在的編號為k的石板,小易單次只能往前跳k的乙個約數(不含1和k)步,即跳到k+x(x為k的乙個

非1和本身的約數)的位置。小易當前處在編號為n的石板,他想跳到編

號恰好為m的石板去,小易想知道最少需要

跳躍幾次可以到達。

例如:

n = 4,m = 24:

4->6->8->12->18->24

於是小易最少需要跳躍5次,就可以從4號石板跳到24號石板

輸入描述:

輸入為一行,有兩個整數n,m,以空格隔開。 (4 ≤ n ≤ 100000) (n ≤ m ≤ 100000)

我的解題思路是廣搜,n為搜尋起始的節點,m為搜尋結束的節點。

搜尋節點的規則:根據題目描述,對於節點k,可以展開搜尋的節點為k+x,其中x為k的約數,同時,為了避免重複搜尋節點,需要乙個標記陣列。

特別注意:求k的約數的方法通常是

for (int i = 2; i < k; i++) 

}

我一開始是這麼做的,然後超時了,因為當k很大的時候迴圈次數也會變得很多,之後用這樣的方法替代

for (int i = 2; i <= math.sqrt(k); i++) 

} 完整**

public class q1 

for (int i = 2; i <= math.sqrt(cur); i++)

if (cur / i == i)

continue;

next = cur + cur / i; //同上

if (next <= m && !vis[next]) }}

}system.out.println(reachable ? minstep : -1);

}}

3 10 跳蚱蜢 廣度優先搜尋

有9只盤子,排成1個圓圈。其中8只盤子內裝著8只蚱蜢,有乙個是空盤。我們把這些蚱蜢順時針編號為 1 8 每只蚱蜢都可以跳到相鄰的空盤中,也可以再用點力,越過乙個相鄰的蚱蜢跳到空盤中。請你計算一下,如果要使得蚱蜢們的隊形改為按照逆時針排列,並且保持空盤的位置不變 也就是1 8換位,2 7換位,至少要經...

跳石板問題 C

小易來到了一條石板路前,每塊石板上從1挨著編號為 1 2 3 這條石板路要根據特殊的規則才能前進 對於小易當前所在的編號為k的石板,小易單次只能往前跳k的乙個約數 不含1和k 步,即跳到k x x為k的乙個非1和本身的約數 的位置。小易當前處在編號為n的石板,他想跳到編號恰好為m的石板去,小易想知道...

網易跳石板問題詳解

基本思想 dp演算法 首先建立乙個最大值 1那麼大的陣列表示每乙個石板,之所以是最大值 1的原因是要取下標為最大值的石板 然後遍歷每個石板,把每個石板的約數都儲存起來,然後取到從這個石板過去的最小值 即最優解 然後取最大值對應的那個石板返回就ok dp演算法的核心思維其實就是每一步取最優解,它也是一...