我是靠谱客的博主 害羞朋友,最近开发中收集的这篇文章主要介绍POJ 3278 Catch The Cow,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:http://poj.org/problem?id=3278

从题目中可以提取以下几个信息

1.每个位置最多访问一次

2.农夫有三种走法,分别是:原位置+1,原位置-1,原位置*2;

3.如果K<N,只能用walking的方法;如果K>N,可以用walking,也能用teleporting的方法。

4.当N=0时,第一步只能用原位置+1的走法。

其实整个题目可以抽象成一个图遍历的题目,每个位置(除了0和100000)都有三种路径到一个新的位置。如何抓到牛呢?最简单的方法就是遍历每个位置,直到找到牛所在的位置,即遍历图。我们知道遍历图的一般方法有深度优先搜索(DFS)和广度优先搜索(BFS)。由于K和N的值都有可能为100000,如果采用深度优先搜索,可能会达到很大的深度,计算量可能会很大,如果用bfs,则搜索到牛的时候,所用的步骤就是最少的。

已经AC的代码如下:

#include<cstdio>
#include<queue>
using namespace std;
typedef struct located
{
int point;
int step;
}location;
int dfs(int farmer , int cow)
{
queue<location>loc;
bool visited[200002];
location front,next;
memset(visited,0,sizeof(visited));
front.point=farmer;
front.step=0;
loc.push(front);
while(!loc.empty())
{
front=loc.front();
loc.pop();
/*判断是否越界,是否曾近访问过,如果是,则本次循环结束*/
if(front.point>100000 || visited[front.point]==true || front.point<0)
{
continue;
}
if(front.point==cow)
//抓到牛,结束
{
return front.step;
}
front.step++;
if(front.point<cow)
{
next=front;
next.point=next.point*2;
loc.push(next);
}
if(front.point>0)
//如果大于0,将原位置+1的新位置放入队列中
{
next=front;
next.point--;
loc.push(next);
}
next=front;
next.point++;
loc.push(next);
visited[front.point]=true;
//标记该位置已经被访问过
}
return -1;
}
int main(void)
{
int N,K,time;
while(scanf("%d%d",&N,&K)!=EOF)
{
time=dfs(N,K);
printf("%dn",time);
}
return 0;
}


最后

以上就是害羞朋友为你收集整理的POJ 3278 Catch The Cow的全部内容,希望文章能够帮你解决POJ 3278 Catch The Cow所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部