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("%d\n",time);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值