Catch That Cow POJ - 3278
题目大意:
给出小于等于100000的两个数字 a,b
从a到b最少需要几次
每次可以+1,-1,*2
输出结果
分析:
简单BFS
将a放入队列中,如果队列不空,就取出队头,分析三种情况,如果没被访问过就将新的a放入队列,直到取出的队头等于b,返回查找的次数。
AC代码:
#include <iostream>
#include <cstring>
#include <queue>
#define Max_Size 100005
using namespace std;
queue<int> Q;
bool vis[Max_Size];
int Length[Max_Size]={0};
int BFS(int N,int K){
Q.push(N);
vis[N]=true;
Length[N]=0;
while(!Q.empty()){//队列不空
N=Q.front();
Q.pop();
int n_N;
if(N==K)
return Length[N];
for(int i=1;i<=3;i++){
switch(i){
case 1:
n_N=N+1;
break;
case 2:
n_N=N-1;
break;
case 3:
n_N=N*2;
break;
}
if(n_N>=0 && n_N<=100000 && !vis[n_N]){
//cout<<n_N<<" 666"<<endl;
Q.push(n_N);
vis[n_N]=true;
Length[n_N]=Length[N]+1;
}
}
}
return -1;
}
int main(){
memset(vis,false,sizeof(vis));
int N,K;
cin>>N>>K;
int ans=BFS(N,K);
if(ans>=0)
cout<<ans<<endl;
return 0;
}