您的位置:首页 > 其它

【POJ】3278-Catch That Cow 简单BFS

2018-02-27 21:32 387 查看
http://poj.org/problem?id=3278

一个数轴,点初始在N(0 ≤ N ≤ 100,000),有两种移动方式

1.当前在X,下一秒在X+1或X-1

2.当前在X,下一秒在2*X

最短多久到达K?

不用复杂话,共有3种移动方式,全部进行一次入队就好了。

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

const int maxn=1000001;
int n,k;
struct Node{
int dis;
int step;
};
bool vis[maxn];

int main(){

cin >> n >> k;
memset(vis,false,sizeof(vis));
queue <Node> q;
Node Now;
Now.dis=n;
Now.step=0;
vis[Now.dis]=true;
q.push(Now);
while (!q.empty()){
Now=q.front();
if (Now.dis==k){
cout << Now.step << endl;
return 0;
}
q.pop();
Node tmp;

tmp.dis=Now.dis-1;
tmp.step=Now.step+1;
if (tmp.dis>=0&&tmp.dis<=100000&&!vis[tmp.dis]){
vis[tmp.dis]=true;
q.push(tmp);
}

tmp.dis=Now.dis+1;
tmp.step=Now.step+1;
if (tmp.dis>=0&&tmp.dis<=100000&&!vis[tmp.dis]){
vis[tmp.dis]=true;
q.push(tmp);
}

tmp.dis=Now.dis*2;
tmp.step=Now.step+1;
if (tmp.dis>=0&&tmp.dis<=100000&&!vis[tmp.dis]){
vis[tmp.dis]=true;
q.push(tmp);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: