69,336
社区成员
发帖
与我相关
我的任务
分享
抓住奶牛!★★★★
Time Limit:1000MS Memory Limit:65536K
Total Submit:45 Accepted:12
Description
不得了,xiaoC的农场里跑出来了一只奶牛,这可是让xiaoC很是揪心啊,于是xiaoC立刻放下了手头的工作,想疯狂的奶牛奋力追去,但说来也怪,xiaoC的走法还真有一点特殊,他每一步有两种走法:
步行:xiaoC可以从任何X位置,一步走到X-1或X+1位置
跳跃:xiaoC可以从任意X位置,一步跳跃到2*X的位置
现在我们假设奶牛并没有意识到xiaoC的追来,还在原地傻傻地站着,请你来帮xiaoC计算一下,他需要多少步,才能把奶牛逮住!!!
Input
每个测试实例为一行,包含两个数据,N和K,N表示xiaoC现在的位置,K表示奶牛的位置,0 ≤ N,K ≤ 100,000
Output
输出xiaoC能逮住奶牛的最少步数,每个测试实例输出一行
Sample Input
5 17
Sample Output
4
Hint
在这个实例中最快的路径为5-10-9-18-17,共四步
Source
xiaoC
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct //将数字和步数放一起
{
int num;
int step;
}ElemType;
typedef struct QueueNode //定义队列结点
{
ElemType data;
struct QueueNode *next;
}QueueNode;
typedef struct //定义队列
{
QueueNode *front;
QueueNode *rear;
}Queue;
int InitQueue(Queue *Q) //初始化队列
{
Q->front = Q->rear = (QueueNode *)malloc(sizeof(QueueNode));
if (Q->front == NULL)
return FALSE;
Q->front->next = NULL;
return TRUE;
}
int EnterQueue(Queue *Q, ElemType e) //入队
{
QueueNode *t;
t = (QueueNode *)malloc(sizeof(QueueNode));
if (t == NULL)
return FALSE;
t->data = e;
t->next = NULL;
Q->rear->next = t;
Q->rear = t;
return TRUE;
}
int DeleteQueue(Queue *Q, ElemType *e) //出队
{
QueueNode *t;
t = Q->front->next;
if (t == NULL)
return FALSE;
(*e) = t->data;
if (t == Q->rear)
{
Q->rear = Q->front;
Q->front->next = NULL;
}
else
Q->front->next = t->next;
free(t);
return TRUE;
}
int main()
{
int man, cow;
int n;
Queue Q;
ElemType e;
ElemType t;
scanf("%d%d", &man, &cow);
if (man == cow)
n = 0;
else if (man > cow)
n = man - cow;
else
{
e.num = man;
e.step = 0;
InitQueue(&Q);
EnterQueue(&Q, e);
while (1)
{
DeleteQueue(&Q, &e);
t.num = e.num - 1; //对应man-1这种情况
t.step = e.step + 1;
if (t.num == cow)
{
e = t;
break;
}
else if (t.num < 0) //如果小于0就没有必要入队
goto s;
else
EnterQueue(&Q, t);
if (e.num > cow) //如果当前man的坐标大于cow的坐标,没有必要再往上加
continue;
s: t.num = e.num + 1; //对应man+1这种情况
t.step = e.step + 1;
if (t.num == cow)
{
e = t;
break;
}
else
EnterQueue(&Q, t);
t.num = e.num * 2; //对应man*2这种情况
t.step = e.step + 1;
if (t.num == cow)
{
e = t;
break;
}
else
EnterQueue(&Q, t);
}
n = e.step;
}
printf("%d", n);
return 0;
}
#include <iostream>
#include <queue>
using namespace std;
queue<int> calcu(int N, int K)
{
int tempN = N;
queue<int> qN;
qN.push(tempN);
while(tempN != K)
{
if(tempN*2 > (K+1))
{
tempN--;
qN.push(tempN);
}
else
{
tempN*=2;
qN.push(tempN);
}
}
return qN;
}
int main()
{
int N;
int K;
cin>>N;
cin>>K;
while(N>0 && K>0 && N<10000 && K < 10000)
{
queue<int> qN = calcu(N,K);
int size = qN.size();
for(int i = 0; i < size; i++)
{
cout<<qN.front()<<" ";
qN.pop();
}
cout<<endl;
cin>>N;
cin>>K;
}
return 0;
}
#include <stdio.h>
int function(int man, int cow)
{
int a, b, c;
if (man == cow)
return 0;
if (man > cow)
return (man - cow);
a = function(man - 1, cow) + 1;
b = function(man + 1, cow) + 1;
c = function(man * 2, cow) + 1;
a = a < b ? a : b;
a = a < c ? a : c;
return a;
}
int main()
{
int man, cow;
int n;
scanf("%d%d", &man, &cow);
n = function(man, cow);
printf("%d", n);
return 0;
}
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
bool s[200001];
int bfs(int n,int k)
{
if(k<=n) return n-k;
int layer=0,i;
int size=1;
queue<int>q;
memset(s,0,sizeof s);
q.push(n);
s[n]=1;
while(1)
{
layer++;
while(size--)
{
n=q.front();
q.pop();
int a[3]={n+1,n-1,n*2};
for(i=0;i<3;i++)
{
if(a[i]==k) goto out;
if(a[i]>0&&a[i]<=200000&&!s[a[i]])
{
q.push(a[i]);
s[a[i]]=1;
}
}
}
size=q.size();
}
out: return layer;
}
int main()
{
int k;
int n;
while(cin>>n>>k)
{
cout<<bfs(n,k)<<endl;
}
return 0;
}