提示
题意:有一个农民和一头牛,他们在一个数轴上,牛在k位置保持不动,农户开始时在n位置。设农户当前在M位置,每次移动时有三种选择:1.移动到M-1;2.移动到M+1位置;3.移动到M*2的位置。问最少移动多少次可以移动到牛所在的位置。所以可以用广搜来搜索这三个状态,直到搜索到牛所在的位置。
#include <iostream> #include <cstdio> #include <queue> #include <cstdlib> #include <cstring> using namespace std; int vis[200010],i; struct node { int step,data; }s,v; int bfs(int x,int k) { queue<struct node>q; s.data=x; s.step=0; q.push(s); while(!q.empty()) { v=q.front(); q.pop(); if(v.data==k) { printf("%d\n",v.step); return 1; } if(v.data>=1&&!vis[v.data-1]) { s.step=v.step+1; s.data=v.data-1; vis[v.data-1]=1; q.push(s); } if(v.data<=k&&!vis[v.data+1]) { s.step=v.step+1; s.data=v.data+1; vis[v.data+1]=1; q.push(s); } if(v.data<=k&&!vis[v.data*2]) { s.step=v.step+1; s.data=v.data*2; vis[v.data*2]=1; q.push(s); } } return -1; } int main() { int n,k; while(~scanf("%d%d",&n,&k)) { memset(vis,0,sizeof(vis)); vis[n]=1; bfs(n,k); } return 0; }//此题与最短步数那个题一样最短步数用BFS中的队列分层存取各种状态,这个队列中第一层是走一步的step=1,位置有三个,每一层所有的位置全部进入队列该层只要有到达的点此时的step就是满足条件的步数,步数一步一步依次加一,
