HDOJ/HDU 2717 Catch That Cow 一维广度优先搜索 so easy..............

看题:http://acm.hdu.edu.cn/showproblem.php?pid=2717

思路:相当于每次有三个方向,加1,减1,乘2,要注意边界条件,减1不能小于0,乘2不能超过最大值。

然后还要注意N>=K的时候,只能减1才能到达。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
struct node{
	int pos,step;
}p,q;
int N,K,mmin;
bool visit[200010];
void bfs()
{
	queue<node> Q;
	memset(visit,0,sizeof(visit));
	p.pos=N;
	p.step=0;
	Q.push(p);
	visit[N]=1;
	while(!Q.empty())
	{
		p=Q.front();
		Q.pop();
		if(p.pos==K){
			if(p.step<mmin)mmin=p.step;
		}
		for(int i=0;i<3;i++)
		{
			if(i==0){         //x+1; 
				if(p.pos>K)
					continue; 
				q.pos=p.pos+1;
				if(visit[q.pos])continue;
				q.step=p.step+1;
				Q.push(q);	
				visit[q.pos]=1;
			}
			else if(i==1){    //x-1; 
			

				q.pos=p.pos-1;
				if(visit[q.pos])continue;
				if(q.pos<0)continue;
				q.step=p.step+1;
				Q.push(q);
				visit[q.pos]=1;
			}
			else if(i==2){    //2*x;
				if(p.pos>K)continue;
				q.pos=2*p.pos;
				if(visit[q.pos])continue;
				if(q.pos>100000)continue;
				q.step=p.step+1;
				Q.push(q);
				visit[q.pos]=1;
			}
			
		}
	}
}
int main()
{
	//ifstream fin;
	//fin.open("data1.txt");
	while(cin>>N>>K)
	{
		mmin=99999;
		if(N>=K){
			cout<<N-K<<endl;
		}
		else {
			bfs();
			cout<<mmin<<endl;
		}
			
		
	}
	
	return 0;

}

 


原文地址:https://www.cnblogs.com/javawebsoa/p/3150307.html