在長度爲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;
}