日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(BFS)Catch That Cow(poj3278)

發(fā)布時(shí)間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (BFS)Catch That Cow(poj3278) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:

農(nóng)夫知道一頭牛的位置,想要抓住它。農(nóng)夫和牛都于數(shù)軸上 ,農(nóng)夫起始位于點(diǎn) N(0<=N<=100000) ,牛位于點(diǎn) K(0<=K<=100000) 。農(nóng)夫有兩種移動(dòng)方式: 1、從 X移動(dòng)到 X-1或X+1 ,每次移動(dòng)花費(fèi)一分鐘 2、從 X移動(dòng)到 2*X ,每次移動(dòng)花費(fèi)一分鐘 假設(shè)牛沒有意識到農(nóng)夫的行動(dòng),站在原地不。最少要花多少時(shí)間才能抓住牛?
Input
一行: 以空格分隔的兩個(gè)字母: N 和 K
Output
一行: 農(nóng)夫抓住牛需要的最少時(shí)間,單位分鐘
Sample Input
5 17
Sample Output
4
Hint
農(nóng)夫使用最短時(shí)間抓住牛的方案如下: 5-10-9-18-17, 需要4分鐘.

分析與解答

由于無法確定深度,因此用bfs廣搜,bfs不需要回溯,是一層一層推進(jìn),一直到最后的解


這題有三種情況,后退一步,前進(jìn)一步,前進(jìn)二倍當(dāng)前距離,那我們就層次遍歷,每層輸入到隊(duì)列里,輸完了就把上一層pop掉,就是不斷遍歷并且查找,遇到最終結(jié)果return并輸出time即可
為了減小時(shí)間,我們需要判重,每次只入那些曾經(jīng)沒出現(xiàn)過的數(shù)。
這一類bfs具體怎么實(shí)現(xiàn),就是先建一個(gè)隊(duì)列,然后把第一個(gè)數(shù)push里面,只要隊(duì)列不空,就一直對隊(duì)列進(jìn)行出隊(duì)入隊(duì)操作。需要有兩個(gè)變量 m,next;m存的是根結(jié)點(diǎn),每次循環(huán)最初需要把他取出,next存的是由根結(jié)點(diǎn)+1-1*2從而形成的子結(jié)點(diǎn),我們存子結(jié)點(diǎn)時(shí)注意判重,不重復(fù)我們就push next,并且標(biāo)記。注意每次操作完之后我們都要檢查一下是不是滿足最終的結(jié)果,如果滿足我們直接return就行

代碼參考:https://blog.csdn.net/qq_38620461/article/details/78445374

#include<bits/stdc++.h> using namespace std; int to[2]={1,-1}; int a,b,sum; int vis[100000]; struct place {int x,time; }; int check(place k) {if(k.x<0||k.x>100000||vis[k.x]==1)return 0;return 1; } int bfs(place n) {place m,next;queue<place>w;w.push(n);while(!w.empty()) {m=w.front();w.pop();if(m.x==b)return m.time;for(int i=0;i<2;i++){next.x=m.x+to[i];next.time=m.time+1;if(next.x==b)return next.time;if(check(next)){w.push(next);vis[next.x]=1;}}next.x=m.x*2;next.time=m.time+1;if(next.x==b)return next.time;if(check(next)){w.push(next);vis[next.x]=1;}}return 0; } int main() {int i,j,t;place x1;while(~scanf("%d %d",&a,&b)){memset(vis,0,sizeof(vis));x1.x=a;x1.time=0;vis[x1.x]=1;sum=0;sum=bfs(x1);printf("%d\n",sum);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的(BFS)Catch That Cow(poj3278)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。