【牛客网】bfs广度搜索

题目描述

小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置x_0。对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7。因为使用神秘力量要耗费太多体力,所以它只能使用神秘力量最多100,000次。贝壳总生长在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你帮忙计算最少需要使用多少次神秘力量就能吃到贝壳。

输入描述:

输入一个初始位置x_0,范围在1到1,000,000,006

输出描述:

输出小易最少需要使用神秘力量的次数,如果使用次数使用完还没找到贝壳,则输出-1
示例1

输入

125000000

输出

1
set.find(x)如果x在集合中将返回x所在位置,若不存在,等于set.end()
两种方式,广度搜索,选取最优
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
#define M 1000000007
queue<long int>q;//保存x的1模值 
map<long int,int>m;//x的模值,移动次数
int result(long int x){
	if(x>=1&&x<=1000000006){
	q.push(x%M);
	m[x%M]=0;
	while(!q.empty()){
		long int now=q.front();
		q.pop();
		if(now==0)
		return m[now];
		if(m[now]<100000){
			long int x1=(4*now+3)%M;
			if(m.find(x1)==m.end()){//说明x1不在集合中
			q.push(x1);
			m[x1]=m[now] +1;
			}
			long int x2=(8*now+7)%M;
			if(m.find(x2)==m.end()){
				m[x2]=m[now]+1;
				q.push(x2);
			}
		}
	  }	
	}
	return -1;
}
int main(){
	long int x;
	cin>>x; 
    cout<<result(x)<<endl;
	return 0;
} 


牛客网上,与“数字变换”相关的题目主要涉及算法设计和数据处理,通常要求通过最少的操作步骤将一个数字变换为目标数字。这类题目广泛出现在编程竞赛和技术面试中,考察逻辑思维、动态规划(DP)能力以及对数学运算的理解。 ### 数字变换相关题目与解析 #### 1. 数字变换的最小步数 牛客网上有一道关于数字变换的经典题目,目标是通过最少的操作步骤将一个整数变换为目标数字。常见的操作包括加一、减一、乘二、取平方根等[^4]。例如,从数字 `ori` 变换到 `fi`,可以采用深度优先搜索(DFS)或广度优先搜索BFS)来寻找最短路径。 一种实现方式如下,该代码使用了递归和双精度转换来处理平方根操作: ```cpp void dfs(double current, int steps, double target) { if (current == target) { // 找到目标,记录步数 return; } if (steps >= min_steps) { return; // 剪枝,避免无效搜索 } // 尝试不同的操作 dfs(current + 1, steps + 1, target); dfs(current - 1, steps + 1, target); dfs(current * 2, steps + 1, target); if (current > 0) { dfs(ceil(sqrt(current)), steps + 1, target); dfs(floor(sqrt(current)), steps + 1, target); } } ``` #### 2. 动态规划在数字变换中的应用 对于某些数字变换问题,动态规划是一种高效的解决方案。例如,使用 DP 数组 `dp[i]` 表示从初始值变换到 `i` 所需的最少操作次数。初始化时,将 `dp` 数组填充为一个较大的值(如 `aim + 1`),表示不可达的状态。最终如果 `dp[aim]` 仍大于 `aim`,说明无法变换到目标值,返回 `-1` [^2]。 以下是一个典型的动态规划实现: ```java public int minMoney(int[] arr, int aim) { if (arr.length == 0) return -1; if (aim == 0) return 0; int[] dp = new int[aim + 1]; Arrays.fill(dp, aim + 1); dp[0] = 0; for (int i = 0; i < aim + 1; i++) { for (int j = 0; j < arr.length; j++) { if (i >= arr[j]) { dp[i] = Math.min(dp[i], dp[i - arr[j]] + 1); } } } return dp[aim] > aim ? -1 : dp[aim]; } ``` #### 3. 数字变换与广度优先搜索BFS) 在某些情况下,数字变换问题可以转化为图的最短路径问题,使用广度优先搜索BFS)进行求解。例如,从一个整数出发,通过一系列操作到达目标整数,每一步操作可以看作图中的一条边。BFS 能够保证在最短路径上找到解。 例如,从数字 `100` 到 `800` 的变换问题,可以定义操作为加一、减一、乘以某个数、除以某个数等。BFS 可以有效探索所有可能的操作路径,并在找到目标值时返回当前步数。 以下是 BFS 的伪代码实现: ```python from collections import deque def min_transform_steps(start, target): visited = set() queue = deque([(start, 0)]) # (current_value, steps) visited.add(start) while queue: current, steps = queue.popleft() if current == target: return steps # 生成下一步可能的状态 next_states = [current + 1, current - 1, current * 2, current // 2] for next_state in next_states: if next_state not in visited: visited.add(next_state) queue.append((next_state, steps + 1)) return -1 # 无法变换到目标值 ``` #### 4. 数字变换与剪枝优化 在某些数字变换问题中,由于状态空间较大,直接使用 BFS 或 DFS 可能导致性能问题。因此,可以引入剪枝策略来优化搜索过程。例如,在 BFS 中,可以通过设置上限和下限来限制搜索范围,或者在 DFS 中提前终止不可能达到最优解的路径。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值