刷题:奇怪的电梯

题目名称:字符串的展开

时间: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;
}
相关推荐
草莓熊Lotso1 天前
【LeetCode刷题指南】--有效的括号
c语言·数据结构·其他·算法·leetcode·刷题
草莓熊Lotso7 天前
【数据结构初阶】--双向链表(二)
c语言·数据结构·经验分享·链表·刷题
草莓熊Lotso9 天前
【LeetCode刷题指南】--数组串联,合并两个有序数组,删除有序数组中的重复项
c语言·数据结构·其他·刷题
charlie11451419112 天前
我的Qt八股文笔记2:Qt并发编程方案对比与QPointer,智能指针方案
笔记·qt·面试·刷题·并发编程·异步
凤年徐15 天前
【数据结构与算法】203.移除链表元素(LeetCode)图文详解
c语言·开发语言·数据结构·算法·leetcode·链表·刷题
草莓熊Lotso17 天前
【洛谷题单】--顺序结构(一)
c语言·c++·其他·刷题
努力的小帅2 个月前
C++_STL_map与set
开发语言·数据结构·c++·学习·leetcode·刷题
Belgnas3 个月前
刷题:(题目名称)(模板)
刷题
愚润求学3 个月前
【专题四】前缀和(3)
开发语言·c++·笔记·leetcode·刷题·c++11
愚润求学3 个月前
【专题刷题】二分查找(一):深度解刨二分思想和二分模板
开发语言·c++·笔记·leetcode·刷题