題目描述:
從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; }