洛谷 1136.奇怪的电梯

news/2024/7/20 20:11:41 标签: 深度优先, 算法, c++

这道题其实用bfs会更加方便,这里的题目前面的测试点是卡的dfs的点,所以如果你用的dfs进行暴搜的话,前面的几个测试点就会TLE,因此需要用比较高效的bfs。这里就不讲bfs了,等到后面做到bfs的点之后再回过头来看,这里只讲dfs的比较暴力的解法。

思路:其实思路很简单,我们从题目中可以知道,这是一个指数型的递归,对于我们所在的每一层来说,都有选择上层或者下层的选择,就这两种选择,所以我们就需要两次dfs的递归。

如果我们不剪枝的情况下,大多数就会变成MLE的情况。为什么呢?我们考虑一种可能性:

假设我们现在在1层,需要上5层,这时我们的过程可能是1-2-...-2-5,也可能是1-2-...-5。那么问题来了,这个时候我们需要选择哪一种方案呢?答案很明显,我们需要选择第二种方案才能保证最佳,而且,在我们递归的时候也不排除有无限循环的时候,就比如刚刚那个2-2-2等等,这都会造成你的内存消耗太多,并且也会让时间超时,因此避免这种情况的发生,我们有一个状态数组来标记我们来过的楼层,这样才能保证我们不会在后面选择楼层的时候出现同一个楼层的情况。

在我们进行判断标记的时候,不要忘记标记当前我们dfs遍历的地方,然后再去判断我们将要去的楼层是否该不该去。这样剪枝差不多就行了,如果你不放心,那就在前面加上判断操作次数和判断位置的剪枝就行,这样除去那几个卡DFS得测试点以外,我们就都能通过。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath> 
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<sstream>
#include<map>
#include<limits.h>
#include<set>
#define MAX 205
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
typedef long long LL;
LL n, m, counts=0;
LL A, B;
int res = 1e9;
LL arr[MAX];
int st[MAX];
bool flag = false;
void dfs(int u,int op) {
    if (op >= res)
        return;
    if (u == B) {
        res = min(res, op);
        return;
    }
    st[u] = true;
    if (u + arr[u] <= n && !st[u + arr[u]]) {
        st[u + arr[u]] = 1;
        dfs(u + arr[u], op + 1);
        st[u + arr[u]] = 0;

    }
    if (u - arr[u] > 0 && !st[u - arr[u]]) {
        st[u - arr[u]] = 1;
        dfs(u - arr[u], op + 1);
        st[u - arr[u]] = 0;
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    cin >> n;
    cin >> A >> B;
    _for(i, 1, n + 1)
        cin >> arr[i];
    dfs(A,0);
    if (res == 1e9)
        cout << -1 << endl;
    else
        cout << res << endl;
    return 0;
}


http://www.niftyadmin.cn/n/5404432.html

相关文章

【Android】隐藏settings中的二级菜单

需求&#xff1a;隐藏安全性和位置信息下的安全更新二级条目 系统&#xff1a;Android8.1 代码地址&#xff1a;MtkSettings/src/com/android/settings/SecuritySettings.java private PreferenceScreen createPreferenceHierarchy() { .... PreferenceGroup securityStatusPr…

【JavaScript 漫游】【028】拖拉事件

文章简介 本篇文章为【JavaScript 漫游】专栏的第 027 篇文章&#xff0c;主要记录了 JavaScript 中拖拉事件的知识点。 拖拉事件的种类 拖拉&#xff08;drag&#xff09;指的是&#xff0c;用户在某个对象上按下鼠标键不放&#xff0c;拖动它到另一个位置&#xff0c;然后…

蓝桥杯备赛第五篇(动态规划)

1.数位dp public class Main {static long[] limit;static int length;static long[][] dp;public static long dfs(int pos, int pre, boolean flag, boolean lead) {if (pos length) return 1;if (!flag && !lead && dp[pos][pre] ! -1) return dp[pos][pr…

点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识 &#xff08;一&#xff09;PCD点云存储格式相较于其它存储格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的优势[1] &#xff08;1&#xff09;具有存储和处理有组织的点云数据集的能力&#xff0c;这对于实时应用和增强现实及机器…

MySQL 核心模块揭秘 | 07 期 | 二阶段提交 (1) prepare 阶段

二阶段提交的 prepare 阶段&#xff0c;binlog 和 InnoDB 各自会有哪些动作&#xff1f; 本文基于 MySQL 8.0.32 源码&#xff0c;存储引擎为 InnoDB。 1. 二阶段提交 二阶段提交&#xff0c;顾名思义&#xff0c;包含两个阶段&#xff0c;它们是&#xff1a; prepare 阶段。…

SQL项目——O2O优惠券使用预测之数据处理

一、任务目标 1、任务 &#xff08;1&#xff09; 数据导入及预处理。 &#xff08;2&#xff09; 特征构建。 &#xff08;3&#xff09; 特征拼接。 二、数据形式 1、图像呈现 2、特征描述 三、分析步骤 1、导入数据 ‘Date_received’和‘Date’设为 Date 格式&#xff0…

C++ //练习10.3 用accumulate求一个vector<int>中的元素之和。

C Primer&#xff08;第5版&#xff09; 练习 10.3 练习10.3 用accumulate求一个vector中的元素之和。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*******************************************************************…

【六】【SQL】多表查询,笛卡尔积

笛卡尔积 笛卡尔积发生在当你在查询中将两个或多个表进行交叉连接&#xff08;CROSS JOIN&#xff09;或者没有指定任何连接条件时。假设第一个表有M行&#xff0c;第二个表有N行&#xff0c;那么结果集将包含M x N个记录。在大多数情况下&#xff0c;笛卡尔积并不是你想要的结…