题目链接
Catch That Cow POJ - 3278
题目大意
目前位置为n,目的地为k
这是一个序列,有两种方法行走耗费时间单位都是1
(设当前值为n)
n->(n+1) || n->(n-1)
n->2*n
都是一个单位的时间,问到达目标点的最短时间
总结
- 求解最短距离首先想到
bfs
🐶 - 先写出来运行发现需要剪枝
- 需要学习的是打破常规思路,剪枝也要针对不同的方式进行限制而不是整体限制
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,k;
int v[100005];
queue<int> q;
int main(){
cin>>n>>k;
memset(v,-1,sizeof(v));
q.push(n);
v[n] = 0;
while(q.size()){
int now = q.front();
q.pop();
if(now == k)
break;
if(now*2<=100000&&v[now*2]==-1)
q.push(now*2),v[now*2]=v[now]+1;
if(now+1<=100000&&v[now+1]==-1)
q.push(now+1),v[now+1]=v[now]+1;
if(now-1>=0&&v[now-1]==-1)
q.push(now-1),v[now-1]=v[now]+1;
}
cout<<v[k]<<endl;
return 0;
}