刷题:奇怪的电梯

题目名称:字符串的展开

时间:2025年4月19日

知识点:dfs、dijkstra...(应该有好多种解法)


网址:洛谷 P1135 奇怪的电梯

来源:散题


个人感想:一道很好写,但是超超超难优化的,dfs题喵(应该还有其他的解法的说)

思路:

  • 刚开始写的时候花了不到20分钟就写了一个简单的dfs,果不其然STL了,于是开始想方设法优化减枝,先是尝试了能不能通过判断当前楼层到达的次数是否大于2来判断,发现完全没用,并且因为我的回溯出了问题导致反而通过的数据减少了,后来,我突然发现这题完全可以看成dijkstra来写,于是参考了dijkstra(记录一个点到其他所有点的最短距离)的思路,经过一番调试才写出来了,总用时大概1h。

收获:(有的话就写)

  • 没有语法上的收获

埋坑:要不我们再写个bfs和dijkstra的版本?


完整代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define INF 0x3f3f3f3f

const int N = 210;

int nex[N], floor_min[N]; // nex数组存储每层可移动的层数,floor_min数组存储起点到每一层的最短步数
int n, st, ed;

void dfs(int floor, int step)
{
    floor_min[floor] = step; // 记录当前路径到达该楼层的步数(一定是更优的才会进入)

    // 向下移动
    if (floor - nex[floor] >= 1 && step + 1 < floor_min[floor - nex[floor]]) // 若向下移动合法且步数更优
    {
        dfs(floor - nex[floor], step + 1);
    }

    // 向上移动
    if (floor + nex[floor] <= n && step + 1 < floor_min[floor + nex[floor]]) // 若向上移动合法且步数更优
    {
        dfs(floor + nex[floor], step + 1);
    }
}

int main()
{
    IOS;
    memset(floor_min, INF, sizeof(floor_min)); // 初始化最短步数为无穷大

    cin >> n >> st >> ed; // 输入总楼层数、起点、终点
    for (int i = 1; i <= n; i++)
        cin >> nex[i];

    floor_min[st] = 0; // 起点步数为0(初始位置无需移动)
    dfs(st, 0);  // 从起点开始搜索

    cout << (floor_min[ed] == INF ? -1 : floor_min[ed]) << endl; // 看了题解后果断放弃了自己单纯的if-else判断

    return 0;
}
相关推荐
2601_949950632 天前
一套小程序,解决资料整理、在线刷题和错题复盘
人工智能·小程序·刷题·练习·小程序推荐
2601_949950639 天前
练题簿,把培训从“走过场”变成“真落地”
人工智能·学习·小程序·刷题·小程序推荐
2601_9499506312 天前
考研英语资料太散?用小程序把真题、词汇和错题放到一起
人工智能·学习·考研·小程序·刷题·小程序推荐
2601_9499506314 天前
没有现成习题,试试AI再写出题
人工智能·小程序·刷题·练习·小程序推荐
2601_9499506316 天前
在线刷题用什么小程序?认识一下能导资料、AI出题的练题簿
人工智能·学习·小程序·刷题·小程序推荐
2601_9499506320 天前
成绩提升不靠盲目刷题:用练题簿找准真正的薄弱知识点
学习·小程序·刷题·小程序推荐
2601_949950631 个月前
在线练题更方便,用练题簿打造属于自己的移动题库
学习·考研·刷题·小程序推荐
2601_949950631 个月前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
金创想4 个月前
积木移动题目分析及解题思路——木块问题(1)
c++·算法·字符串·c·刷题·信息学奥赛·积木
xy34534 个月前
软件评测师基础知识专项刷题:网络安全技术(三)
刷题·软考·备考·软件设计师·软件评测师