题目大概:
一个人捉一头牛,他们在一条直线上,人和牛分别在一个位置上n,m,牛不动,人可以左走1,右走1,右走2*n,问最少几步人可以捉到牛。
思路:
用广搜。
用队列存数据,每次都把该坐标下的三种走法存入队列,每次从队头取出数据判断是否捉到牛。
代码:
已更新
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=1e5;
int sum=0;
int n,k;
bool vis[maxn+10];
struct node
{
int x;
int t;
};
void bfs()
{
queue<node>Q;
node st;
st.x=n;st.t=0;
Q.push(st);
while(!Q.empty())
{
node u=Q.front();Q.pop();
if(u.x==k)
{
sum=u.t;
break;
}
if(!vis[u.x+1]&&(u.x+1<=maxn))
{
vis[u.x+1]=1;
node v;
v.x=u.x+1;v.t=u.t+1;
Q.push(v);
}
if(!vis[u.x-1]&&(u.x-1>=0))
{
vis[u.x-1]=1;
node v;
v.x=u.x-1;v.t=u.t+1;
Q.push(v);
}
if(u.x*2<=maxn)
{
if(!vis[u.x*2])
{
vis[u.x*2]=1;
node v;
v.x=u.x*2;v.t=u.t+1;
Q.push(v);
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d%d",&n,&k))
{
sum=0;
memset(vis,0,sizeof(vis));
vis[n]=1;
//memset(vis,0,sizeof(vis));
bfs();
printf("%d\n",sum);
}
return 0;
}