Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.
* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.
If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
5 17
4
该题主要需要判断状态,每个点的状态不仅有坐标,还有下一步该走的方式(向前,向后,跳一步),所以使用vis数组来记录;
#include <iostream> #include <queue> #include <cstring> using namespace std; const int maxn=1000000; int vis[maxn][3]; int n,k; struct node { int x; int step; }; int bfs() { queue<node>q; node nxt,pre; pre.x=n,pre.step=0; q.push(pre); while(!q.empty()){ pre=q.front(); q.pop(); if(pre.x==k){ return pre.step; } for(int i=0;i<3;i++){ // int tempx; if(i==0){ nxt.x=pre.x-1; nxt.step=pre.step+1; if(!vis[nxt.x][0]&&nxt.x>=0&&nxt.x<4*100000){ q.push(nxt); vis[nxt.x][0]=1; } } if(i==1){ nxt.x=pre.x+1; nxt.step=pre.step+1; if(!vis[nxt.x][1]&&nxt.x>=0&&nxt.x<4*100000){ q.push(nxt); vis[nxt.x][1]=1; } } if(i==2){ nxt.x=2*pre.x; nxt.step=pre.step+1; if(!vis[nxt.x][2]&&nxt.x>=0&&nxt.x<4*100000){ q.push(nxt); vis[nxt.x][2]=1; } } } } return -1; } int main() { ios::sync_with_stdio(false); while(cin>>n>>k){ memset(vis,0,sizeof vis); cout<<bfs()<<endl; } return 0; }