一维数组的移动(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;
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值