Catch that cow

BFS
#include<iostream>             //导入相关头文件
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;

const int maxn=100001;

bool vis[maxn]; //标记数组
int step[maxn]; //记录到了到达每一个位置所走的步数
queue <int> q; //定义队列,实现广度优先搜索

int bfs(int n,int k)
{
int head,next; //记录第一个位置和下一个位置
q.push(n); //开始农夫在n位置,n入队
step[n]=0;
vis[n]=true; //用来标记是否已经访问
while(!q.empty()) //当队列非空
{
head=q.front(); //取队首
q.pop(); //弹出队首
for(int i=0;i<3;i++) //农夫的三种走法
{
if(i==0) next=head-1; //第一种:x-1
else if(i==1) next=head+1; //第二种:x+1
else next=head*2; //第三种:2x
if(next<0 || next>=maxn) continue; //排除出界情况:超出输入范围
if(!vis[next]) //如果next位置未被访问
{
q.push(next); //入队
step[next]=step[head]+1; //步数加1
vis[next]=true; //标记设为被访问
}
if(next==k) return step[next]; //当遍历到母牛位置,返回步数
}
}
}
int main() //主函数部分
{
int n,k;
while(cin>>n>>k)
{
memset(step,0,sizeof(step)); //数组和变量的初始化,防止乱码的出现
memset(vis,false,sizeof(vis));

while(!q.empty()) q.pop(); //注意调用前要先清空,没有清空会无法ac
if(n>=k) printf("%d\n",n-k); //剪枝
else printf("%d\n",bfs(n,k));
}
return 0;
}

笔记:寻找母牛是经典的BFS(广度优先搜索)题目,也有可行性剪枝,当农夫的位置大于母牛,只能重复执行x-1操作

版权声明:

本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/became_a_wolf/article/details/51284492

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注