| C电梯 | |
|
问题描述
NK中学科学馆大楼装上了一种奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
输入格式
输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤2000, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。
输出格式
输出文件仅一行,即最少按键次数,若无法到达,则输出-1。
样例输入
5 1 5
3 3 1 2 5
样例输出
3
提示
1→4→2→5
一道 搜索 题
至于你想用dfs还是bfs都无所谓
那么我就讲讲dfs的解法
思路很简单:只要每越界,就朝上和朝下搜,搜到终点就return;
(注意,深搜有多个答案,return时记得去min)
ans = min(ans, sum);
那,深搜分支该怎么写呢?
if 现在的位子 + 移动的楼数 <= 大楼最高层:dfs(下一步,次数加一)//判断语句检查是否越界、
//同样,往下走就判断下面是否越界,然后继续dfs
⚠️注意!!:一定要记得申明一个访问数组,以免重复判定!!⚠️
一定要记得申明一个访问数组,以免重复判定
一定要记得申明一个访问数组,以免重复判定
重要的事情说三遍~
void dfs(int s, int sum) {
if (s == b) { // 是否已找到答案
ans = min(ans, sum);
return;
} else if (sum <= ans) {
v[s] = 1;//访问数组去重
if (s + c[s] <= n && !v[s + c[s]]) {//边界判定
dfs(s + c[s], sum + 1);
}
if (s - c[s] >= 1 && !v[s - c[s]]) {//边界判定
dfs(s - c[s], sum + 1);
}
v[s] = 0;//记得复原
}
}
切记几个“良心提醒”
1.因为求最小,所以ans初始化要很大
ans = 99999999
Like this
2.如果没有找到答案,还要记住一个判定来判断
if (ans == 99999999) {
cout << -1;
return 0;
}
想要完整代码?
都给到这个分儿上了!
没门!!!
[ END ]
该博客讨论了一个关于 NK 中学科学馆大楼电梯的奇怪规则。从 A 楼到 B 楼的最少按键次数可通过深度优先搜索(DFS)算法解决。博主建议在不越界的情况下向上或向下搜索,并强调在实现 DFS 时要避免重复判定,初始化答案为最大值,并在找不到路径时返回 -1。
1344

被折叠的 条评论
为什么被折叠?



