一维的广度优先遍历 注意怎么用数组写队列,还有就是基本剪枝,最后是检测结尾的位置,是在for循环内部,而不是外部哦 #include <cstdio> using namespace std; const int MAX = 100010; typedef struct _Node { int step; int cur; }Node; Node queue[MAX]; bool exist[MAX]; int queuelast,queuefront; int begin , end; bool getnext( const Node&left , Node& right , int step ) { if( step == 0 ) right.cur = left.cur - 1 ; else if( step == 1 ) right.cur = left.cur + 1 ; else right.cur = 2 * left.cur; right.step = left.step + 1; if( right.cur >= 0 && right.cur < MAX && exist[right.cur] == false ) return true; else return false; } int find() { Node top; queuelast = 1 ; queuefront = 0; queue[0].cur = begin; queue[0].step = 0; exist[queue[0].cur] = true; if( begin == end ) return 0; while( queuelast != queuefront ) { top = queue[queuefront]; queuefront = ( queuefront + 1 )%MAX; for( int i = 0 ; i != 3 ; ++i ) if( getnext( top , queue[queuelast] , i )) { exist[ queue[ queuelast ].cur ] = true; if( queue[ queuelast ].cur == end ) return queue[queuelast].step; queuelast = ( queuelast + 1 )%MAX; } } return -1; } int main() { scanf("%d%d",&begin,&end); printf("%d/n",find()); return 0; }