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;
}
从题目中可以提取以下几个信息
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 3278 catch the cow
- POJ 3278: Catch the Cow(我的第一道广搜...)
- POJ-3278 Catch the cow(BFS)
- poj3278——Catch That Cow
- POJ 3278 Catch That Cow-模拟
- POJ 3278 Catch That Cow
- POJ 3278 Catch That Cow(DFS)
- POJ 3278 Catch That Cow
- poj 3278 Catch That Cow bfs
- POJ 3278 Catch That Cow
- poj_3278 Catch That Cow(bfs)
- POJ-3278 Catch That Cow【广度优先搜索】
- poj 3278 Catch That Cow (广搜,简单)
- POJ 3278 Catch That Cow(BFS+队列)
- poj 3278 catch that cow (广度优先BFS)
- POJ 3278 Catch That Cow
- poj 3278 Catch That Cow 广度优先搜索
- POJ 3278 Catch that cow 广度优先搜索bfs
- poj 3278 Catch That Cow
- poj 3278(hdu 2717) Catch That Cow(bfs)