您的位置:首页 > 其它

POJ 3278 Catch The Cow

2013-08-24 15:58 363 查看
题目: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("%d\n",time);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj search 算法 BFS