奇怪的电梯——DFS算法

题目

题解

每到一层楼都面临了两种选择:上还是下?因此我们可以定义一个布尔数组用来记录选择。

终止条件其实也明显,要么到了B层,要么没有找到楼层。

如果找到了,选择一个步骤少的方式。又怎么表示没有找到楼层?

定义一个答案res,把它定义很大,如果找到了答案,更新最小值即可。

int res=1e9;

res = min(res,cnt);

这其实都很简单,关键在于怎么剪枝?

第一,找答案的过程中如果发现cnt>res,就可以剪掉了

第二,每一层尽可能只来一次,如果选择了相同的选择。就消耗了一定的cnt,不可取。如果选择了不同的方式,没找到B层也还行,如果找到了,那我们第一次到这个楼层的时候就该选这个不同的方式,整个方案就已经没有必要再进行下去了。所以综上,再选择的时候我们应该一个楼层最多走一次。

答案

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

const int N = 210;

int n;
int A,B;
int K[N];
int res = 1e9;
bool st[N] = {false};

void dfs(int x,int cnt)
{
	if(cnt > res) return ;
	if(x == B)
	{
		res = min(res,cnt);
		return ;
	}
	
	if(x+K[x] <= n && !st[x+K[x]]){
		st[x] = true;
		dfs(x+K[x],cnt+1);
		st[x]=false;
	}
	if(x-K[x] > 0 && !st[x+K[x]])
	{
		st[x] = true;
		dfs(x-K[x],cnt+1);
		st[x] = false;
	}
	
}

int main()
{
	cin >> n >> A >> B;
	for(int i = 1;i<=n;i++)
	{
		cin >> K[i];
	}
	
	st[A]=true;
	dfs(A,0);
	if(res == 1e9){
		cout << "-1";
		return 0;
	}
	cout << res;
	return 0;
}
相关推荐
司小豆5 分钟前
视觉-语言基础模型作为高效的机器人模仿学习范式
人工智能·算法·机器人
oioihoii1 小时前
C++23 新特性:为 std::pair 的转发构造函数添加默认实参
算法·c++23
智者知已应修善业1 小时前
【验证哥德巴赫猜想(奇数)】2021-11-19 15:54
c语言·c++·经验分享·笔记·算法
-qOVOp-2 小时前
zst-2001 历年真题 设计模式
java·算法·设计模式
evolution_language3 小时前
LintCode第68题-二叉树的前序遍历,第67题-二叉树的后序遍历
数据结构·算法·新手必刷编程50题
passionSnail3 小时前
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-俄罗斯方块:用旋转矩阵打造经典
算法·matlab·矩阵·游戏程序·交互
yxc_inspire3 小时前
C++STL在算法竞赛中的应用详解
c++·算法·stl
James. 常德 student3 小时前
leetcode-hot-100(哈希)
算法·leetcode·哈希算法
金融小师妹3 小时前
量化解析美英协议的非对称冲击:多因子模型与波动率曲面重构
大数据·人工智能·算法
是店小二呀3 小时前
【算法-哈希表】常见算法题的哈希表套路拆解
数据结构·c++·算法·散列表