題目大意:給定乙個數n (o≤n≤100000),變成另乙個數k(o≤k≤100000),允許的操作是乘以2,或者加減1,問最少要幾步才能完成?
題目分析: 一般這種求有多少種方案的感覺用bfs 的居多。反正這題是用bfs的,然後廣度優先搜尋都是要用到佇列的,然後感覺這題就比較裸吧,只是一維的,相對於之前做的那個抄作業(三維bfs),不過比較尷尬的是那個一直不知道哪地方錯了。就題論題。這題就是先使滿足條件的*2,+1或者-1,然後壓入佇列,讓上一次的隊頭出佇列。啊呀,感覺好難講,還是結合**講吧,最好手算模擬一下,當初我也是理解不了,然後手算模擬的,才明白的。
#include #include #include #include #include using namespace std;
struct nodeq,p;
bool vis[400010];//作為標記陣列,標記已經走過的點
int main()//如果到達目的點,則中斷,輸出步數
p.count ++;//此點的步數加1,按照點的運動規則,到達下列的點
if(p.o < k)
q=p;
q.o ++;
if(vis[q.o]== false)
}if(p.o > 0)
}bfs.pop(); //已經搜過的點就出佇列。
} }return 0;
}
poj 3278 bfs(抓住那頭牛)
題意 農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農夫起始位於點n 0 n 100000 牛位於點k 0 k 100000 農夫有兩種移動方式 1 從x移動到x 1或x 1,每次移動花費一分鐘 2 從x移動到2 x,每次移動花費一分鐘 假設牛沒有意識到農夫的行動,站在原地不動。農夫最少要...
POJ3278 BFS容易出現思維漏洞
本體是標準的三個入口的bfs水題,但是細節問題太多 1.陣列沒必要太大,一旦re了,是因為出現了這麼幾種情況,出現負數,因為題中宣告不會有負數的出現,把負數的情況短路掉 還有就是我們一不小心越界,這時候,我們和上一種一樣,我們需要先預判短路,再進行下標訪問 2.記錄陣列是很有必要的,防止tle 3....
POJ 3278 簡單廣搜
poj3278 題意 輸入n,m,求由n到m需要最少步數,n只能加一減一或者乘二。寫的第二道廣搜題,發現用佇列就是每一種可能讀入隊尾,然後再從隊首乙個乙個的遍歷。需要做的是判斷條件和記錄步數。includeusing namespace std include include include def...