简单BFS,题目意思大概是输入一个人的坐标和一头牛的坐标,这个人有三种状态:1.向左走一步 2.向右走一步 3.当前坐标X2
问最少多少次能到达牛的坐标。
枚举三种状态,条件满足加入队列,最后判断是否到达。
数组模拟队列:
#include<stdio.h>
#include<string.h>
#define MAX 100010
int x,k;
int vis[MAX];
struct node
{
int m,step;
}now,next,que[MAX];
int bfs()
{
int head,tail;
head=tail=0;
que[tail].m=x;
que[tail].step=0;
vis[x]=1;
tail++;
while(head<tail)
{
now=que[head];
head++;
for(int i=0;i<3;i++)
{
if(i==0) next.m=now.m-1;
else if(i==1) next.m=now.m+1;
else next.m=now.m*2;
if(next.m<0||next.m>=MAX)
continue;
if(!vis[next.m])
{
vis[next.m]=1;
next.step=now.step+1;
que[tail]=next;
tail++;
}
if(next.m==k)
return next.step;
}
}
}
int main()
{
scanf("%d%d",&x,&k);
if(x>=k)
{
printf("%d\n",x-k);
}
else
{
printf("%d\n",bfs());
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MAX 100010
int x,k;
int vis[MAX];
struct node
{
int m;
int step;
}now,next;
queue<node> q;
int BFS()
{
now.m=x;
now.step=0;
q.push(now);
vis[x]=1;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<3;i++)
{
if(i==0) next.m=now.m-1;
else if(i==1) next.m=now.m+1;
else next.m=now.m*2;
if(next.m<0||next.m>=MAX)
continue;
if(!vis[next.m])
{
vis[next.m]=1;
next.step=now.step+1;
q.push(next);
}
if(next.m==k)
return next.step;
}
}
}
int main()
{
memset(vis,0,sizeof(vis));
scanf("%d%d",&x,&k);
if(x>=k)
printf("%d\n",x-k);
else
printf("%d\n",BFS());
return 0;
}