当前位置: 首页 > news >正文

奇怪的电梯——DFS算法

题目

题解

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

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

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

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

int res=1e9;

res = min(res,cnt);

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

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

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

答案

#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;
}

http://www.dtcms.com/a/130200.html

相关文章:

  • linux多线(进)程编程——(4)进程间的传音术(命名管道)
  • Android envsetup与Python venv使用指南
  • CST1017.基于Spring Boot+Vue共享单车管理系统
  • 【软考系统架构设计师】软件工程知识点
  • AI agents系列之全面介绍
  • 密码加密方式
  • 【基础算法】递推算法 - java
  • go之为什么学go?
  • 常用AI辅助编程工具及平台介绍
  • 数据集 handpose_x_plus 3D RGB 三维手势 - 手工绘画 场景 draw picture
  • 【无标题】四色拓扑模型与黑洞信息存储的统一性论证(猜想)——基于规范场论与全息原理的跨学科研究
  • 机器学习(5)——支持向量机
  • 基于ssm网络游戏推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
  • stm32week11
  • ASR评测全方位指标解析:准确性与实时性的平衡-ASR评测
  • 啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!
  • Sentinel规则持久化pull模式核心源码解析
  • 多线程与Tkinter界面交互
  • transformer的基本结构和工作原理,多头自注意力机制的作用是什么,为什么使用位置编码?
  • 《算法笔记》3.6小节——入门模拟->字符串处理
  • 扩散模型 Diffusion Model 整体流程详解
  • 我拿Cursor复现了Manus的效果
  • 上层 Makefile 控制下层 Makefile ---- 第二部分(补充一些例子与细节)
  • URL结构、HTTP协议报文
  • Redis for Windows 后台服务运行
  • 【6】深入学习http模块(万字)-Nodejs开发入门
  • javascript专题2 ---- 在 JavaScript 列表(数组)的第一个位置插入数据
  • 【Linux C】简单bash设计
  • 重返JAVA之路——面向对象
  • 论文:Generalized Category Discovery with Large Language Models in the Loop