珠海建站程序,正规大宗商品交易平台,wordpress 注册会员默认权限,开发app多少钱费用目录 1.前言
2.题目#xff1a;奇怪的电梯
1.题目描述
2.输入格式
3.输出格式
4.输入输出样例
5.说明
6.题解 3.小结 1.前言
哈喽大家好啊#xff0c;前一段时间小编去备战蓝桥杯所以博客的更新就暂停了几天#xff0c;今天继续为大家带来题解分享#xff0c;希望大…目录 1.前言
2.题目奇怪的电梯
1.题目描述
2.输入格式
3.输出格式
4.输入输出样例
5.说明
6.题解 3.小结 1.前言
哈喽大家好啊前一段时间小编去备战蓝桥杯所以博客的更新就暂停了几天今天继续为大家带来题解分享希望大家多多支持我哦~
2.题目奇怪的电梯
1.题目描述
呵呵有一天我做了一个梦梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯而且第 i 层楼1≤i≤N上有一个数字 Ki0≤Ki≤N。电梯只有四个按钮开关上下。上下的层数等于当前楼层上的那个数字。当然如果不能满足要求相应的按钮就会失灵。例如 3,3,1,2,5 代表了 KiK13K23……从 1 楼开始。在 1 楼按“上”可以到 4 楼按“下”是不起作用的因为没有 −2 楼。那么从 A 楼到 B 楼至少要按几次按钮呢
2.输入格式
共二行。
第一行为三个用空格隔开的正整数表示 N,A,B1≤N≤2001≤A,B≤N。
第二行为 N 个用空格隔开的非负整数表示 Ki。
3.输出格式
一行即最少按键次数若无法到达则输出 -1。
4.输入输出样例 5.说明
对于 100% 的数据1≤N≤2001≤A,B≤N0≤Ki≤N。
本题共 16个测试点前 15 个每个测试点 6 分最后一个测试点 10 分。
6.题解
#includeiostream
#includealgorithm
#includecstring
using namespace std;const int N230;int n0,a0,b0;//分别记录大楼总高度当前楼层目标楼层
int fl[N];//记录按钮
int ans1e9;//记录次数
bool st[N];//判断该楼层是否已经登过void dfs(int x,int ans1){if(ans1ans)return ;if(x0||xn)return ;//超出范围了剪枝if(xb){ansmin(ans,ans1);return ;}if(xfl[x]n!st[xfl[x]]){st[xfl[x]]true;dfs(xfl[x],ans11);st[xfl[x]]false;//回溯原来状态}if(xfl[x]0!st[xfl[x]]){st[xfl[x]]true;dfs(x-fl[x],ans11);st[xfl[x]]false;}
}int main(){cinnab;for(int i1;in;i){cinfl[i];}dfs(a,0);if(ans1e9){printf(-1);return 0;}coutans;return 0;
}
这道题思路如下 这道题我是用dfs解决的。搜索有俩条路径一个是向上查询另一个是向下查询。剪枝条件有俩个1.如果上升或下降小于等于0或者大于n。 2.枚举次数过大 。另外为了节省时间选择用bool数组记录楼层选择状态以免造成某一层楼反复到达所造成的tle。 3.小结
今天的分享到这里就结束了希望大家多多点赞多多收藏多多支持我哦~