题目描述:
从N到K,N可以N+1,N-1,N*2这三种方式前进,找到K为止!至少需要多少次前进!
AC代码如下:
//“横向”广搜,用到队列. #include <iostream> #include <queue> using namespace std; const long N=200001;//因为输入的数n,k最大值为100000, //但有一个2*k位置要存储,所以要将N设置到两倍最大值。 int main() { queue<long> q;//建立队列q long n,k,a[N];//数组记录前进的步数 while(cin>>n>>k)//从n开始去搜索k。 { memset(a,0,sizeof(a));//将数组a每个元素赋0 if(n==k) { cout<<a[n]<<endl; continue;// 如果输入的n==k,直接输出 } q.push(n);//否则,n压入队列 while(!q.empty()) { int c=q.front();//取队头 if(c==k) { cout<<a[c]<<endl;//如果==k,则输出数组在该位置的值 while(!q.empty())//并且销毁队列 q.pop(); break; } a[c]++;//如果!=k,让该位置的数组自增一 q.pop(); //搜索与对头相关的三个数,且判断是否满足条件 if(c-1>=0&&a[c-1]==0) { q.push(c-1);//该位置压入队列 a[c-1]=a[c];//将对头数组值赋予该位置数组 } if(c+1<=2*k&&a[c+1]==0) { q.push(c+1); a[c+1]=a[c]; } if(2*c<=2*k&&a[2*c]==0) { q.push(2*c); a[2*c]=a[c]; } } } return 0; }