Poj 3278 Catch That Cow

题目大意:给定两个整数N和K,可以对N进行+1,-1,*2的操作,要求通过尽可能少的操作步骤使得N和K相等。

思路:BFS,另外当N>K时,可以直接输出N-K。

#include <iostream>
using namespace std;
#include <stdio.h>
#include <deque>
#include <memory.h>
deque<int> data;
int sign[100010];
int n,k;
int BFS() {
	int size,x,ctr,flag;
	if (n==k)
		return 0;

	ctr=0;
	flag=0;
	data.push_back(n);
	sign[n]=1;
	while (!data.empty()) {
		size=data.size();
		ctr++;
		while (size--) {
			x=data.front();
			data.pop_front();
			if (2*x==k||x-1==k||x+1==k) {
				flag=1;
				break;
			}
			if (2*x<100005&&sign[2*x]==0) {
				data.push_back(2*x);
				sign[2*x]=1;
			}
			if (x>=0&&sign[x-1]==0) {
				sign[x-1]=1;
				data.push_back(x-1);
			}
			if (sign[x+1]==0) {
				sign[x+1]=1;
				data.push_back(x+1);
			}
		}
		if (flag==1)
			break;	
	}
	return ctr;
}
int main()
{
	int result;

	scanf("%d%d",&n,&k);
	if (n>k)
		printf("%d\n",n-k);
	else {
		memset(sign,0,sizeof(sign));
		result=BFS();
		printf("%d\n",result);
	}
	return 0;
}



你可能感兴趣的:(Poj 3278 Catch That Cow)