来源:POJ3278
就是一个bfs,一开始还想,我要是vis标记了,以后怎么办。。。果然还是没有离开dfs的影响。。。还要多多学习。
还有一个注意点,就是如何记录我们的步数,这个用数组的方法有推广意义,注意多多学习。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN= 100000+10;
bool vis[MAXN];
int step[MAXN];
queue<int>q;
int n,k;
int bfs(){
int temp,n1;
int cnt=0,i;
step[cnt]=0;
if(n==k)return 0;
while(!q.empty()){
temp=q.front();
q.pop();
for(i=0;i<3;i++){
if(i==0) n1=temp+1;
else if(i==1) n1=temp-1;
else if(i==2) n1=temp*2;
if(n1>MAXN||n1<0) continue;
if(!vis[n1]){
if(n1==k){
return step[temp]+1;
}
else{
step[n1]=step[temp]+1;
q.push(n1);
vis[n1]=true;
}
}
}
}
}
int main(){
while(scanf("%d%d",&n,&k)!=EOF){
memset(vis,false,sizeof(vis));
memset(step,0,sizeof(step));
while(!q.empty())q.pop();
q.push(n);
vis[n]=0;
cout<<bfs()<<endl;
}
return 0;
}