農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點n(0<=n<=100000),牛位於點k(0<=k<=100000)。農夫有兩種移動方式:1、從x移動到x-1或x+1,每次移動花費一分鐘2、從x移動到2*x,每次移動花費一分鐘1.1 輸入假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要花多少時間才能抓住牛?
兩個整數,n和k1.2 輸出
乙個整數,農夫抓到牛所要花費的最小分鐘數1.3樣例輸入與輸出
樣例輸入c++5 17
樣例輸出
4
#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回退快捷鍵,它會馬上返回到...