抓住那头牛!!!
在一条数轴上有一个农民和他的一头牛,cow奶牛;农民要抓住牛,现在农民有三种移动方式:
1.x->x+1耗时一分钟;
2.x->x-1耗时一分钟;
3.第三种比较吊了,瞬移,x->2x耗时一分钟;
以上x代表农民所在坐标;
问:农民至少需要多长时间能抓住牛?
这个问题用广搜比较好,深搜会超时,那什么是广搜?
广搜就是一层层扩展,对于所到达的每个位置计算出下一步能到达的所有位置,一层层扩展,直到找到目标;
用数组模拟队列储存每一步到达的坐标和所需步数,这就用到了结构体;
下面直接上代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{ //定义一个结构体,包含该点的坐标,和到达该点的步数(分钟);
int x;
int step;
}q[100005],temp;
int head=0, tail=1; // 定义队列的头和尾;
int book[100005]; //用来标记该点是否走过;
int main(){
int N, K; //N是农民所在位置,K是cow所在位置;
scanf("%d%d",&N,&K);
q[head].x=N;
q[head].step=0; //先把起点放入队列;
book[N]=1; //标记起点;
int i;
while(head<tail) //到队列为空时循环结束,当然该题一定会抓到cow,所以不会空;
{
if(q[head].x==K) //如果第一步就到达K,直接循环结束;
break;
int i, tx, s, flag=0;
for(i=1; i<=3; i++) //下一步直接到达的有三种情况;
{
if(i==1) //第一种情况;
tx=q[head].x+1;
else if(i==2) //第二种情况;
tx=q[head].x-1;
else //第三种情况;
tx=q[head].x*2;
if(!book[tx] && tx>=0 && tx<=100000) //if 该点没有走过,并且不越界,放入队列;
{
book[tx]=1; //标记;
q[tail].x=tx;
q[tail].step=q[head].step+1;
tail++;
}
if(tx==K) //if 到达该点停止;
{
flag=1;
break;
}
}
if(flag) //if flag==1,说明已经找到cow,循环停止;
break;
head++; //队首出队,再扩展下一个;
}
printf("%d\n",q[tail-1].step); //队尾一直保持空,所以输出前一个;
return 0;
}