很久没有写bfs,wa了好多发。
注意点:
1 一定要加book标记
2 当n>k的时候只能进行-1的操作 (剪枝)
3 要判断是否越界之后再判断是否标记过
4 不超出最大边界
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
struct node {
int step,pos;
node (){}
node ( int p,int x ) { step = x; pos = p; }
};
int n,k;
int ans;
queue<node> que;
int book[100100];
int main()
{
while ( scanf("%d%d",&n,&k)!=EOF ) {
if ( n>=k ) {
cout<<n-k<<endl;
}
else {
memset( book , 0 ,sizeof book ) ;
ans = 100001;
while( !que.empty() ) que.pop();
que.push( node (n,0) ) ;
book[n] = 1 ;
while( !que.empty() )
{
node temp = que.front();
que.pop();
int tpos = temp.pos;
int tx;
if ( tpos==k ) {
ans = temp.step;
break;
} else {
tx = tpos+1;
if ( tx>=0 && tx<=100000 && !book[tx] ) { //!!!!!!
book[tx] = 1 ;
que.push(node(tx,temp.step+1));
}
tx = tpos*2;
if ( tx>=0 && tx<=100000 && !book[tx] ) {
book[tx] = 1 ;
que.push(node(tx,temp.step+1));
}
tx = tpos-1;
if ( tx>=0 && tx<=100000 && !book[tx] ) {
book[tx] = 1 ;
que.push(node(tx,temp.step+1));
}
}
}
cout<<ans<<endl;
}
}
return 0;
}