洛谷 P1135 奇怪的电梯 (剪枝)

探讨一种特殊电梯系统中,从任意楼层A到B所需的最少按钮点击次数。通过暴力深度优先搜索结合剪枝策略,解决无法直接上下楼层的问题,确保算法效率。

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

                                                奇怪的电梯

题目描述

呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第ii层楼(1 \le i \le N)(1≤i≤N)上有一个数字K_i(0 \le K_i \le N)Ki​(0≤Ki​≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3, 3 ,1 ,2 ,53,3,1,2,5代表了K_i(K_1=3,K_2=3,…)Ki​(K1​=3,K2​=3,…),从11楼开始。在11楼,按“上”可以到44楼,按“下”是不起作用的,因为没有-2−2楼。那么,从AA楼到BB楼至少要按几次按钮呢?

输入输出格式

输入格式:

共二行。

第一行为33个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N)N,A,B(1≤N≤200,1≤A,B≤N)。

第二行为NN个用空格隔开的非负整数,表示K_iKi​。

输出格式:

一行,即最少按键次数,若无法到达,则输出-1−1。

输入样例

5 1 5
3 3 1 2 5

输出样例

3

思路:

暴力深搜+剪枝(注意回溯,取最少按键次数方案)

(代码附详细解释说明)

AC 代码:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#define mod 998244353
#define Max 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i=a;i<b;i++)
using namespace std;
typedef long long ll;
const int maxn=100005;
int n,a,b;
int ans=Max;
int arr[205];
bool vis[205];      //vis数组存储是否去过某楼层
void dfs(int sx,int sum){   //sx表示当前楼层,sum统计按键次数
    if(sx==b){              //到达目的楼层
        ans=min(ans,sum);   //取最优方案
    }
    else if(sum<=ans){      //最优剪枝:当前按键次数sum>ans,必不可能为最优方案
        vis[sx]=true;       //标记去过的楼层
        if(sx+arr[sx]<=n && vis[sx+arr[sx]]==false ){   //暴力深搜:上
            dfs(sx+arr[sx],sum+1);
        }
        if(sx-arr[sx]>=1 && vis[sx-arr[sx]]==false){    //暴力深搜:下
            dfs(sx-arr[sx],sum+1);
        }
        vis[sx]=false;              //回溯
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    memset(vis,false,sizeof(vis));
    vis[a]=true;    //记录来过初始楼层
    dfs(a,0);       //开始暴力深搜
    if(ans!=Max){   //判断是否能到达目的楼层
        cout<<ans<<endl;
    }
    else{
        cout<<"-1"<<endl;
    }
    return 0;
}

 

<think>嗯,用户想查找洛谷P1683的题解或解题思路。首先我需要确认这个题目的具体内容,但根据提供的引用资料,用户给出的引用中没有直接提到P1683的信息。不过,用户提供的引用涉及了其他题目的解法,比如P2089、P1597、P1113,这些题目的解法可能包含类似的思路,比如枚举、字符串处理、图论中的拓扑排序等。 首先,我应该检查用户提供的引用内容,看看是否有任何可能相关的解题方法。例如,引用[2]提到了枚举方法,用于解决烤鸡问题,这可能适用于需要穷举所有可能情况的问题。而引用[3]和[5]讨论了使用scanf处理字符串输入的方法,这可能适用于需要解析特定格式输入的题目。引用[4]提到了拓扑排序处理有向图中的任务依赖,这可能适用于涉及任务排序或有依赖关系的问题。 接下来,我需要推测洛谷P1683可能的题目类型。由于用户引用的其他题目涉及枚举、字符串处理和图论,可能P1683也属于这些类型之一。如果题目是涉及枚举,可能需要参考引用[2]中的枚举方法;如果是字符串处理,可以参考引用[3]和[5]的方法;如果是图论或拓扑排序,引用[4]的解法可能相关。 另外,用户提到想查找相关解法或讨论,但由于引用中没有直接提到P1683,可能需要建议用户查阅洛谷的官方题解或社区题解,如引用[1]所述。同时,可以结合常见题型的通用解法,比如动态规划、贪心算法等,但需要根据题目具体内容调整。 需要注意的是,用户可能没有提供足够的关于P1683的信息,因此在回答时应建议用户确认题目要求,并提供一般性的解题步骤,比如分析输入输出、确定算法类型、编写代码框架等。此外,提醒用户参考洛谷的题解资源,如官方题解和社区题解,可能会有更详细的解析。 最后,确保回答结构清晰,分点说明可能的解题思路,并附上相关问题,帮助用户进一步探索可能的解决方法。同时,根据系统指令,正确使用LaTeX格式,确保数学表达式正确,并添加引用标识。</think>根据洛谷题目的常见类型及现有参考资料,以下是对题目P1683的通用解析思路和步骤: ### 一、基础分析步骤 1. **阅读题目描述**:确认题目要求的输入/输出格式及约束条件(如数据范围) 2. **识别题目类型**:根据特征判断属于以下哪种类型: - 枚举问题(参考P2089的枚举解法[^2]) - 字符串处理(参考P1597的输入解析方法[^3][^5]) - 图论问题(参考P1113的拓扑排序思路[^4]) ### 二、典型解法框架 #### 情形1:若为枚举类问题 ```python # 伪代码示例(参考烤鸡题解) def dfs(当前状态): if 满足终止条件: 记录结果 return for 所有可能分支: if 剪枝条件: continue 更新状态 dfs(新状态) 回溯状态 ``` #### 情形2:若为字符串解析类问题 使用`scanf`格式控制符可以高效处理特定格式输入(参考P1597解法): $$ \text{输入模式} = "\%c:=\%c;" $$ 该模式配合循环读取能有效提取变量赋值关系 #### 情形3:若为图论问题 拓扑排序的典型实现步骤: 1. 计算各节点入度 2. 初始化队列(存入度为0的节点) 3. 进行层序遍历并更新入度 4. 记录关键路径长度(参考P1113的完成时间计算) ### 三、推荐参考资料 1. 洛谷官方题解区查看最新解析[^1] 2. 使用题目编号在洛谷博客区搜索(如搜索"P1683 题解") 3. 社区题解中筛选高赞答案(注意不同解法的时空复杂度差异)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值