在长度为n的坐标轴上吗,蒜头君想从A点移动到B点,他的移动规则如下:
1.向前一步,坐标增加1.
2.向后一步,坐标减少1.
3.跳跃一步,使得坐标乘2.
蒜头君不能移动到坐标小于0或者大于n的位置。蒜头君想知道从A点移动到B点的最少步数是多少,你能帮他计算出来吗?
输入格式
第一行输入三个整数n,A,B分别代表坐标轴长度,起始点坐标,终点坐标。
输出格式
输出一个整数占一行,代表蒜头君要做走的最少步数
样例输入:
10 2 7
样例输出
3
BFS实现代码:
#include<iostream>
#include<queue>
using namespace std;
queue<pair<int,int> > q;
bool vis[5005];
int main(){
int n,A,B;
cin>>n>>A>>B;
q.push(make_pair(A,0));//装入开始状态
vis[A]=true;//标记起点访问过
int now,step;
while(!q.empty()){//队列不为空时搜索
now=q.front().first;//now表示位置
step=q.front().second;//step表示步数
q.pop();//出队
if(now==B){//当找到时退出搜索
cout<<step<<endl;//输出步数
return 0;
}
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;
}
DFS实现代码:
#include<cstdio>
int n,A,B;
bool vis[10005];
int ans=99999;
void dfs(int x,int p){
if(p>ans){
return ;
}
if(x==B){
ans=p;
return ;
}
if(x>=0&&x<=n&&!vis[x]){
vis[x]=true;
dfs(x+1,p+1);
dfs(x-1,p+1);
dfs(x*2,p+1);
vis[x]=false;
}
}
int main(){
scanf("%d %d %d",&n,&A,&B);
dfs(A,0);
printf("%d",ans);
return 0;
}