資料結構與演算法分析(十) 母牛的故事

2021-10-01 14:52:03 字數 2196 閱讀 1488

母牛的故事

從前有乙個農夫,他的名字叫做約翰。他養了很多很多頭母牛。突然有一天,乙隻調皮的母牛走丟了,農夫要盡快的抓住她,不然她就又跑掉了!現在我們將問題簡單化。假設農夫和母牛都站在一條數軸上,農夫開始的位置為n,母牛的位置為k。

約翰有三種行動方式,每行動一次需要一秒鐘時間,假設農夫的現在的位置為x,他可以向前走一格到x+1,也可以向後走一格走到x-1,他還可以傳送!一下子走到了2x

那麼我們的問題是,假設母牛不會動,農夫最少需要多少秒才能抓到母牛?

輸入:輸入包括兩個整數,用空格隔開,分別為n和k。其中0<=n,k<=100000。

輸出:乙個整數t,代表農夫所需的最少時間。

廣度優先搜尋(bfs)即可實現,這裡注意每一次向外輻射得到的節點推入佇列後,都要記為已訪問,否則後面可能會出現覆蓋的情況。

演算法實現步驟:

1.每一次取出佇列頭部的元素x

2.分別分析2*x,x-1,x+1,如果沒有訪問過,則將其推入佇列尾部,然後設定**節點、距離,以及將其設定為已訪問

3.判斷是否與這一輪的輻射結果是否有與y相等的,有的話就跳出

注:最後反向求解路徑時,用了乙個vector去反向求**

**實現:

/**

*@name find_noweight:走的過程中距離不變

*@param1 x:起始點

*@param2 y:終止點

**/int

find_noweight

(int x,

int y)if(

(!visited[first+1]

)&&(first+

1<=max_num)

)//如果x+1沒有被訪問過 則插入if(

(!visited[

2*first])&&

(2*first)//如果2*x沒有被訪問過 則插入

}return dist[y];/*

int temp=y;

road.insert(road.begin(),temp);

while(temp!=x)

*/}

農夫走到2x的地方用時2s,x+1和x-1依舊是1s

採用迪克斯特拉演算法求最短路徑

演算法實現步驟:

1.這裡建立了乙個最小堆去儲存進隊的元素

2.取出堆的頭元素x,即未訪問的節點中距離最近的,然後標記為訪問,再刪除

3.判斷取出的頭元素x是否為目標值,是的話直接跳出

4.分別對2*x,x-1,x+1進行分析,如果沒有訪問過,且從x到該位置的距離小於原距離(如果大於的話說明到達此節點存在路徑更短的路線),則將其推入堆,並對堆重新構建

注:1.這裡注意要將元素彈出推的時候才將設定為已訪問,因為此時該節點的最短路徑才是確定的(區域性最優)

**實現:

/**

*@name build_heap:建立堆

*@param1 i:傳入需要安排的節點

**/void

build_heap

(int i)

//判斷當前節點與最小兒子大小

//如果兒子更小的話就上浮 否則就跳出迴圈

if(dist[heap[i]

]>dist[heap[child]])

else}}

/** *@name dijkstra:迪克斯特拉演算法

*@param1 x:起始點

*@param2 y:終止點

**/void

dijkstra

(int x,

int y)

if(visited[first*2]

==0)//如果2*first沒有被訪問過}if

(visited[first+1]

==0)//如果first-1沒有被訪問過}if

(visited[first-1]

==0)//如果first-1沒有被訪問過}}

//尋找路徑

int temp=y;

road.

insert

(road.

begin()

,y);

while

(temp!=x)

}

注:

開陣列的時候一定要多加10,防止越界!!!

資料結構與演算法分析

資料結構與演算法分析可以稱得上是程式設計師必須修煉的內功心法。資料的儲存結構 資料元素在計算機中的儲存方式 資料的操作集合 對一種資料型別的資料所有操作,例如對資料的增刪改查等等!演算法分析主要分析 下面是一些常用資料結構 一 線性表 1.陣列實現 2.鍊錶 二 棧與佇列 三 樹與二叉樹 1.樹2....

資料結構與演算法分析

資料結構 大量資料的組織方法 演算法分析 演算法執行時間的估算。涉及到計算效率。設想,如果能把時間限制從16年減至不到1秒,不很神奇嗎?在很多問題中,乙個重要的觀念是 寫出乙個可以工作的程式並不夠。如果這個程式在巨大的資料集上執行,執行時間就成了重要的 問題。演算法,是為求解乙個問題需要遵循的 被清...

資料結構與演算法分析 note

1 explicit建構函式是用來防止隱式轉換的。請看下面的 class test1 普通建構函式 private int num class test2 explicit 顯式 建構函式 private int num int main test1的建構函式帶乙個int型的引數,23行會隱式轉換成...