参考资料:https://blog.csdn.net/freezhanacmore/article/details/8168265
题意:
John在一根数轴上抓牛,1分钟内有两种移动方式:一个是进(退)1个单位长度,另一个是当前坐标翻倍,给定牛的坐标,和John的起始坐标,求解抓到牛的时间。
BFS基本思想:
1.工具:队列,数组(作访问标记)
2.首先入队一个起点,打上访问标记。
3.只要队列不为空,就出队一个队首元素,看看它满不满足条件。满足直接返回即可。不满足就将它周围相邻元素(即树的下一层)入队。
解题思路:
利用BFS,枚举三种移动方式,不断进行入队,和出队处理操作
核心代码:
int bfs(int x,int y)
{
int head,next;
q.push(x);
step[x]=0;
vis[x]=true;
while(!q.empty())
{
head=q.front();
q.pop();
for(int i=0; i<3; i++)
{
if(i==0)next=head-1;
else if(i==1)next=head+1;
else next=2*head;
if(next<0||next>=maxn)continue;
if(!vis[next])
{
q.push(next);
step[next]=step[head]+1;
vis[next]=true;
}
if(next==y)return step[next];
}
}
}
一些细节:
1.多组数据输入,每次应当进行初始化,利用代码
while(!q.empty()) q.pop();
2.对于数组越界的情况,利用if语句排除
3.对于牛在人后面(即n>=k)的情况,直接输出n-k即可(只能选择后退移动方式)
补充DFS基本思想:
1.方法:递归调用
2.传入起点,首先判断满足条件与否。满足返回即可,不满足就枚举它的下一种情况(即先根遍历),继续调用这个函数。