这就是这个问题,先考虑一下要用什么进行解,应该用深搜还是广搜,
经过思考,我觉得应该用广搜,因为深搜我认为人可以走到牛的后面,这就导致用深搜的话,方法是无限的,还可能会爆栈,所以直接用广搜进行查找,当找到最短的路径直接跳出才是王道。
既然要用广搜,那我们想一想他的要素有什么:队列和v数组标记和步数
开整!!!
#include<stdio.h>
#include<string.h>
//这是装队列的数组
int x[1000000];
//这是标记已经走过的点的数组
int v[1000000];
//这是装步数的数组
int s[1000000];
//控制点在x轴上移动的
int next[3]={1,-1,0};
int main (void)
{
//首先为了符合题目要求,先整一个可以处理多组数据的结构
int num=0,i=0,n=0,m=0;
scanf("%d",&num);
for(i=0;i<num;i++)
{
scanf("%d%d",&n,&m);
//因为是循环,所以每次开头都要对上面三个数组初始化
memset(x,0,sizeof(x));
memset(v,0,sizeof(v));
memset(s,0,sizeof(s));
//控制队列进出的两个变量
int head=1,tail=1;
int j=0;
//这是用来判断移动后的点是否符合要求,不符合的话,扔掉,符合的话,放到队列中去
int tx=0;
x[tail]=n;
s[tail]=0;
v[n]=1;
tail++;
while(head<tail)
{
next[2]=x[head];
for(j=0;j<3;j++)
{
tx=x[head]+next[j];
if(tx>100000||tx<1)
{
continue;
}
if(v[tx]==0)
{
v[tx]=1;
x[tail]=tx;
s[tail]=s[head]+1;
tail++;
}
if(tx==m)
{
break;
}
}
if(tx==m)
{
break;
}
//将队列开头内个移除队列
head++;
}
printf("%d\n",s[tail-1]);
}
return 0;
}
这就是本题的详细解答了,加油!!!
PS(我本题的收获):就是在进行广搜和深搜时,一定要界定一个范围
不能是1到正无穷这种的,要卡住两边,是一个有限的值(因为这个原因一个小时不知道为什么出不了结果)!!!