Catch That Cow bfs

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.

* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.

If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
4
Hint
The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.

       
      題解:很入門的一道搜索題目,就是一條橫軸上,從n點倒k點,每次只能走加一步或減一步或當前步數的兩倍。我們可以用bfs把每次可能走到的位置壓入隊列,然後一次次取出再走就行。因爲數據不大,直接開個數組來判斷是否走過就行。

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;                                    
bool b[400001];                                               //用來判斷是否走過當前位置
int n,m,S;
struct f {
	int node,s;                                           //node爲當前位置,s表示已走步數
};
void bfs() {
	queue<f> q;
	f x,y;
	x.node=n;
	x.s=0;
	q.push(x);
	memset(b,0,sizeof(b));
	b[n]=1;
	while(!q.empty()) {
		x=q.front();
		q.pop();
        if(x.node==m){
        	S=x.s;
        	return ;
		}
		if(x.node-1>=0&&b[x.node-1]==0){                 //向左走
			y.node=x.node-1;
			y.s=x.s+1;
			b[y.node]=1;
			q.push(y); 
		}
		if(x.node+1<400000&&b[x.node+1]==0){             //向右走
			y.node=x.node+1;
			y.s=x.s+1;
			b[y.node]=1;
			q.push(y); 
		}
		if(x.node*2<=400000&&b[x.node*2]==0){            //走兩倍
			y.node=x.node*2;
			y.s=x.s+1;
			b[y.node]=1;
			q.push(y); 
		}
	}
}
int main() {
	cin>>n>>m;
	bfs();
	cout<<S;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章