您的位置:首页 > 其它

Kuangbin专题 - 简单搜索 -C - Catch That Cow

2018-01-04 18:28 260 查看
这是第一个AC版本,思路是逐层标记,这样就能保证步法是单调枚举下去的。需要注意的是,如果之前已经走过了,就相当于“串回去”了,这种枝需要剪掉,否则bfs是无穷无尽的。

#include <cstdio>
#include <queue>
#define ck(_a,_x); if(!sgn[_x]&&_x>0&&_x<=100000){_a.push(_x);sgn[_x]=true;}
using namespace std;
bool sgn[200000]={false};
int bfs(int n,int k){
if(n==k)return 0;
queue<int> q[2];
int step=1,tem,t=0;
q[0].push(n);sgn
=true;
for(;;step++,t=!t){
while(!q[t].empty()){
tem=q[t].front();q[t].pop();
if(tem-1==k||tem+1==k||tem*2==k)return step;
else{ck(q[!t],tem-1);ck(q[!t],tem+1);ck(q[!t],tem*2);}
}
}
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
printf("%d",bfs(n,k));
}


这是第二个版本,把标记改成dpstep数组,可以省去一个交换枚举的队列。

#include <stdio.h>
#define len 66666
int dp[100050]={0},queue[66666]={0},back=0,front=0,ans,n,k,tem;
int ck(int a,int b){
if(b==k){ans=dp[a]+1;return 1;}
if(b>=0&&b<=100000&&!dp[b]){queue[(back++)%len]=b;dp[b]=dp[a]+1;}
return 0;
}
int main(){
scanf("%d%d",&n,&k);
dp
=0;queue[back++]=n;
for(;;){
tem=queue[(front++)%len];
if(tem==k){ans=dp[tem];break;}
if(ck(tem,tem+1)||ck(tem,tem-1)||ck(tem,tem*2))break;
}
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: