寒假水108——搜索【广搜】

 

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 - 1 or + 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.

 

#include<iostream>
#include<stdio.h>  
#include<string.h>  
#include<queue> 
 
using namespace std;
  
int N,K,xin[100002];  
queue<int> q;  
int main() {  
    while(scanf("%d %d",&N,&K)==2) {  
        memset(xin,0x7f,sizeof(xin));  
        q.push(N);  
        xin[N]=0;  
        while (q.size()) {  
            if (q.front()*2<=100000&&xin[q.front()*2]>xin[q.front()]+1) {  
                q.push(q.front()*2);  
                xin[q.front()*2]=xin[q.front()]+1;  
                if(q.front()*2==K)break;  
            }  
            if (q.front()+1<=100000&&xin[q.front()+1]>xin[q.front()]+1) {  
                q.push(q.front()+1);  
                xin[q.front()+1]=xin[q.front()]+1;  
                if(q.front()+1==K)break;  
            }  
            if (q.front()-1>=0&&xin[q.front()-1]>xin[q.front()]+1) {  
                q.push(q.front()-1);  
                xin[q.front()-1]=xin[q.front()]+1;  
                if(q.front()-1==K)break;  
            }  
            q.pop();  
        }  
        cout<<xin[K]<<endl;  
    }  
    return 0;  
}  

题解:队列,王岐叔叔的广搜,套模板就好。

 

 

另一个AC代码:

#include<iostream>
#include<queue>
#include<string>

using namespace std;

queue<int> q;
int used[100001];
int step[100001];

int moveto(int u,int v){
	if(v==0) return(u+1);
	else if(v==1) return(u-1);
	else return(2*u); 
} 

int main(){
	int N,K;
	int i,flag;
	int here,there;
	while(cin>>N>>K){
		memset(used,0,sizeof(used));
		memset(step,0,sizeof(step));
		while(!q.empty()){
			q.pop();
		}
		step[N]=0;
		used[N]=1;
		q.push(N);
		while(!q.empty()){
			flag=0;
			here=q.front();
			q.pop();
			for(i=0;i<3;i++){
				there=moveto(here,i);
				if(there==K){
					cout<<step[here]+1<<endl;
					flag=1;
					break;
				}
				else if(there>=0&&there<=100000&&used[there]==0){
					q.push(there);
					step[there]=step[here]+1;
					used[there]=1;
				}
			}
			if(flag==1) break;
		}
	}
	return 0;
}

这个代码就比较坑了,记得清空used,step函数,却忘了清空队列,debug半天,呜呜……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值