一維數組的移動(BFS,DFS)

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章