题目
思路
由于每次可以往前一步,往后一步,或者向前跳跃两步,那么我们可以使用bfs依次搜索,当第一次到达B点时,就是最小步数
代码
写法一;
#include<bits/stdc++.h>
#include<queue>
using namespace std;
//now表示当前在哪个位置了
//step表示当前走了多少步数了
int n,A,B,now,step;
bool vis[5005];
queue<pair<int,int>> q;
int main(){
cin>>n>>A>>B;;
q.push(make_pair(A,0));
vis[A]=true;
while(!q.empty()){
now=q.front().first;
step=q.front().second;
q.pop();
if(now==B){
cout<<step<<endl;
break;
}
if(now+1<=n && !vis[now+1]){
q.push(make_pair(now+1,step+1));
vis[now+1]=true;
}
if(now-1>=0 && !vis[now-1]){
q.push(make_pair(now-1,step+1));
vis[now-1]=true;
}
if(now*2<=n && !vis[now*2]){
q.push(make_pair(now*2,step+1));
vis[now*2]=true;
}
}
return 0;
}
写法二:
#include<bits/stdc++.h>
using namespace std;
int n,a,b;
bool vis[5005];
int cnt[5005];
int bfs(){
queue<int> q;
q.push(a);
vis[a]=true;
while(!q.empty()){
int x=q.front();
if(x==b){
return cnt[x];
}
q.pop();
for(int i=0;i<3;i++){
int tx;
if(i==0){
tx=x-1;
}else if(i==1){
tx=x+1;
}else{
tx=x*2;
}
if(tx>=0 && tx<=n && !vis[tx]){
cnt[tx]=cnt[x]+1;
q.push(tx);
vis[tx]=true;
}
}
}
return -1;
}
int main(){
cin>>n>>a>>b;
cout<<bfs()<<endl;
return 0;
}