P1135 奇怪的电梯(dfs/bfs)

这篇博客详细介绍了如何解决Luogu平台上的P1135问题,通过两种不同的算法思路——深度优先搜索(DFS)和广度优先搜索(BFS),来探讨电梯运行的规律。作者提供了两种解题方案,分别使用DFS和BFS实现,帮助读者理解这两种经典的图遍历算法在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:https://www.luogu.com.cn/problem/P1135
solve1:dfs

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 210;
int N, A, B;
int k[MAXN];
int ans = INF;
int book[MAXN];
void dfs(int now, int cnt)
{
    if(now == B)
    {
        ans = min(ans, cnt);
        return ;
    }
    if(cnt <= ans)//剪枝,如果当前次数cnt大于ans,那么这个cnt一定不是答案
    {
        book[now] = 1;
        if(now + k[now] <= N && !book[now + k[now]]) dfs(now + k[now], cnt + 1);
        if(now - k[now] > 0 && !book[now - k[now]]) dfs(now - k[now], cnt + 1);
        book[now] = 0;
    }
}
int main()
{
    scanf("%d %d %d", &N, &A, &B);
    for(int i = 1; i <= N; i++)
        scanf("%d", &k[i]);

    memset(book, 0, sizeof(book));
    dfs(A, 0);
    if(ans != INF)
        printf("%d\n", ans);
    else
        printf("-1\n");
    return 0;
}

solve2:bfs

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 210;
int N, A, B;
int k[MAXN];
int ans = INF;
int book[MAXN];
struct node
{
    int nod, cnt;
};
queue<node> q;
int num[MAXN];//一个点经过了几次
void bfs()
{
    while(!q.empty())
    {
        node now = q.front(); q.pop();
        book[now.nod] = 0 ;
        if(now.nod == B)
        {
            ans = min(ans, now.cnt);
        }
        num[now.nod]++;
        if(num[now.nod] >= N) return ;//如果当前的点经过了N次,说明进入了一个循环

        if(now.nod + k[now.nod] <= N && !book[now.nod + k[now.nod]])
        {
            q.push({now.nod + k[now.nod], now.cnt + 1});
            book[now.nod + k[now.nod]] = 1;
        }

        if(now.nod - k[now.nod] > 0 && ! book[now.nod - k[now.nod]])
        {
            q.push({now.nod - k[now.nod], now.cnt + 1});
            book[now.nod - k[now.nod]] = 1;
        }
    }
}
int main()
{
    scanf("%d %d %d", &N, &A, &B);
    for(int i = 1; i <= N; i++)
        scanf("%d", &k[i]);

    memset(book, 0, sizeof(book));
    memset(num, 0, sizeof(num));
    q.push({A, 0});
    book[A] = 1; num[A] ++;
    bfs();
    if(ans != INF)
        printf("%d\n", ans);
    else
        printf("-1\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值