POJ 3278 Catch That Cow
2014-02-25 20:17
381 查看
题目描述:
农夫FJ要经过一定的步数走到他的牛所在的位置,农夫和牛在一条直线上,农夫在点N的位置,他的牛在点K的位置。
农夫没走一步有三种走法,假设农夫现在的位置在x,
三种走法为:1、FJ一步走到x-1的位置
2、FJ一步走到x+1的位置
3、FJ一步走到x*2的位置
要求输出FJ走到牛所在位置所用的最小步数
代码如下:
#include<stdio.h>
#include<string.h>
#define Max 300000
int res;
int mark[Max]; //用于标记第i个点是否已经走过,
struct Pos{ //每次走的位置信息
int x; //点x
int step; //走到点x这个位置时用的最小的步数
};
Pos pos[Max];
void bfs(int n,int k){
int tmp;
int pre=0,last=0;
res=0;
pos[0].x=n;pos[0].step=0;
mark
=1;
while(pre<=last){
tmp=pos[pre].x-1;
if(tmp>=0 && tmp<=Max && mark[tmp]==0){ //剪枝
mark[tmp]=1;
pos[++last].x=tmp;
pos[last].step=pos[pre].step+1;
if(pos[last].x==k){
res=pos[last].step;
return ;
}
}
tmp=pos[pre].x+1;
if(tmp>=0 && tmp<=Max && mark[tmp]==0){ //剪枝
mark[tmp]=1;
pos[++last].x=tmp;
pos[last].step=pos[pre].step+1;
if(pos[last].x==k){
res=pos[last].step;
return ;
}
}
tmp=pos[pre].x*2;
if(tmp>=0 && tmp<=Max && mark[tmp]==0){ //剪枝
mark[tmp]=1;
pos[++last].x=tmp;
pos[last].step=pos[pre].step+1;
if(pos[last].x==k){
res=pos[last].step;
return ;
}
}
pre++;
}
}
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
memset(mark,0,sizeof(mark));
bfs(n,k);
printf("%d\n",res);
}
return 0;
}
本题的主要思路就是宽度优先搜索加剪枝,使用结构体记录没走到一步的位置x和走到这个位置所用的步数step,通过剪枝可以将入栈的数据缩小到Max大小,否则数据量会非常大,导致提交题目后出现RE,因为在mark标记的时候会出现下标小于0。
农夫FJ要经过一定的步数走到他的牛所在的位置,农夫和牛在一条直线上,农夫在点N的位置,他的牛在点K的位置。
农夫没走一步有三种走法,假设农夫现在的位置在x,
三种走法为:1、FJ一步走到x-1的位置
2、FJ一步走到x+1的位置
3、FJ一步走到x*2的位置
要求输出FJ走到牛所在位置所用的最小步数
代码如下:
#include<stdio.h>
#include<string.h>
#define Max 300000
int res;
int mark[Max]; //用于标记第i个点是否已经走过,
struct Pos{ //每次走的位置信息
int x; //点x
int step; //走到点x这个位置时用的最小的步数
};
Pos pos[Max];
void bfs(int n,int k){
int tmp;
int pre=0,last=0;
res=0;
pos[0].x=n;pos[0].step=0;
mark
=1;
while(pre<=last){
tmp=pos[pre].x-1;
if(tmp>=0 && tmp<=Max && mark[tmp]==0){ //剪枝
mark[tmp]=1;
pos[++last].x=tmp;
pos[last].step=pos[pre].step+1;
if(pos[last].x==k){
res=pos[last].step;
return ;
}
}
tmp=pos[pre].x+1;
if(tmp>=0 && tmp<=Max && mark[tmp]==0){ //剪枝
mark[tmp]=1;
pos[++last].x=tmp;
pos[last].step=pos[pre].step+1;
if(pos[last].x==k){
res=pos[last].step;
return ;
}
}
tmp=pos[pre].x*2;
if(tmp>=0 && tmp<=Max && mark[tmp]==0){ //剪枝
mark[tmp]=1;
pos[++last].x=tmp;
pos[last].step=pos[pre].step+1;
if(pos[last].x==k){
res=pos[last].step;
return ;
}
}
pre++;
}
}
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
memset(mark,0,sizeof(mark));
bfs(n,k);
printf("%d\n",res);
}
return 0;
}
本题的主要思路就是宽度优先搜索加剪枝,使用结构体记录没走到一步的位置x和走到这个位置所用的步数step,通过剪枝可以将入栈的数据缩小到Max大小,否则数据量会非常大,导致提交题目后出现RE,因为在mark标记的时候会出现下标小于0。
相关文章推荐
- mysql 随机选择一条记录
- C++内存池的实现
- mysql全文索引笔记1
- 通配符与正则表达式区别(一)
- explicit 关键字
- 【M16】谨记80-20法则
- 【iOS】BaseController的用处
- 二维数组的五种指针表示及指针数组
- centos下配置 redis(1)- 安装篇
- memset()函数用法浅析----笛风读书笔记系列
- MFC控件积累——CRichEdit控件
- 深度学习体会(一) 我的开始
- java线程系列---Runnable和Thread的区别
- POJ 3278 简单 BFS
- c++中模板类型的类型形参与实参的转换
- perl高级排序
- Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图
- GoLang反射的规则
- 基础练习 闰年判断
- Discuz! X2.5数据库字典【转载】