資料結構 棧與佇列(三) 抓住那頭牛

2021-10-02 19:14:52 字數 1777 閱讀 3047

農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點n(0<=n<=100000),牛位於點k(0<=k<=100000)。農夫有兩種移動方式:1、從x移動到x-1或x+1,每次移動花費一分鐘2、從x移動到2*x,每次移動花費一分鐘

假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要花多少時間才能抓住牛?

1.1 輸入
兩個整數,n和k

1.2 輸出
乙個整數,農夫抓到牛所要花費的最小分鐘數

1.3樣例輸入與輸出
樣例輸入

5 17

樣例輸出

4

c++

#include

#include

using

namespace std;

int vis[

200010];

//佇列資料節點

typedef

struct node

node;

void

path

(queue que,

int k)

;int

main()

void

path

(queue que,

int k)

//當前位置退後一格的假設

if(x-

1>=

0&& x-

1<=

100000

&& vis[x-1]

==0)//當前位置前進一格的假設

if(x+

1>=

0&& x+

1<=

100000

&& vis[x+1]

==0)//當前位置前進一倍的假設

if(x*

2<=

100000

&& x*

2>=

0&& vis[x*2]

==0)}

}

其實這道題我能想到的方法就是列舉法,把每一種可能都列舉出來。利用佇列我是這麼做的:

在佇列中插入每一種可能性,然後每一次將佇列的第乙個元素取出:

再通過取出元素的三種運算模式,把三種可能性的元素再次放入佇列中:

通過不斷的列舉,當第乙個符合要求的元素被取出的時候,它是就是步數最少的選擇,即答案。

這種計算方式並不是窮舉法,因為我們規避了很多不必要的計算流程和限定範圍,這種演算法叫做分支界限法,也可以是回溯法,二者的相異之處在於:

回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出在某種意義下的最優解。

二者明顯的區別在進行樹的運算中尤為明顯,而在佇列中,對比並不強烈。

抓住那頭牛(棧與佇列)(廣搜)

描述 農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點n 0 n 100000 牛位於點k 0 k 100000 農夫有兩種移動方式 1 從x移動到x 1或x 1,每次移動花費一分鐘 2 從x移動到2 x,每次移動花費一分鐘 假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要...

資料結構小結 (三)棧與佇列

資料結構來具體實現。佇列 queue 也是表,然而,使用佇列時插入在一端進行而在另一端進行刪除操作。對與佇列而言,不論是使用佇列或者使用鍊錶都是快速的o 1 時間完成操作。先進先出 佇列可以使用陣列與鍊錶實現 陣列實現 其實陣列實現就是我們常說的迴圈佇列,迴圈佇列的應用很多,比如作為緩衝區使用,核心...

大話資料結構 (三)棧與佇列

棧的定義 棧是限定僅在表尾進行插入和刪除操作的線性表,是線性表內的乙個小分支。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 buttom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱lifo結構。在日常生活中,棧的魅力無處不在,比如ctrl z回退快捷鍵,它會馬上返回到...