题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 ii 层楼(1≤i≤N1≤i≤N)上有一个数字 KiKi(0≤Ki≤N0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 3,3,1,2,53,3,1,2,5 代表了 KiKi(K1=3K1=3,K2=3K2=3,……),从 11 楼开始。在 11 楼,按“上”可以到 44 楼,按“下”是不起作用的,因为没有 −2−2 楼。那么,从 AA 楼到 BB 楼至少要按几次按钮呢?
输入格式
共二行。
第一行为三个用空格隔开的正整数,表示 N,A,BN,A,B(1≤N≤2001≤N≤200,1≤A,B≤N1≤A,B≤N)。
第二行为 NN 个用空格隔开的非负整数,表示 KiKi。
输出格式
一行,即最少按键次数,若无法到达,则输出 -1
。
输入输出样例
输入 #1复制
5 1 5 3 3 1 2 5
输出 #1复制
3
说明/提示
对于 100%100% 的数据,1≤N≤2001≤N≤200,1≤A,B≤N1≤A,B≤N,0≤Ki≤N0≤Ki≤N。
本题共 1616 个测试点,前 1515 个每个测试点 66 分,最后一个测试点 1010 分。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static int min = Integer.MAX_VALUE, n, a, b;
static int[] arr, div;//分别表示电梯按钮能上下的层数,和每层到达的最短步数
static class Scanner {//自定义输入类,让输入的速度更快
StreamTokenizer streamTokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public int nextInt() throws IOException {
streamTokenizer.nextToken();
return (int) streamTokenizer.nval;
}
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner();
n = sc.nextInt();
a = sc.nextInt();
b = sc.nextInt();
arr = new int[n + 1];
div = new int[n + 1];
for (int i = 1; i <= n; i++) {
arr[i] = sc.nextInt();
div[i]=-1;//到达第i层电梯所花费的步数,-1表示没有走过
}
min=bfs(a);
System.out.println(min);
}
private static int bfs(int a) {
div[a]=0;//初始电梯,由于一开始就在所以为0
Queue<Integer> queue=new LinkedList<>();//java中常用的队列实现方式
queue.add(a);//初始位置入队
while (!queue.isEmpty()){//由于bfs第一次所到达的次数为最短,所以采用bfs
Integer poll = queue.poll();//将上一次的位置出队
int top=poll+arr[poll];//电梯向上
int down=poll-arr[poll];//电梯向下
if (top<=n&&div[top]==-1){//电梯向上,判断是否走过和超界,以免陷入死循环和报错
div[top]=div[poll]+1;//将走过的电梯次数作为标志,而且下一次不能走
queue.add(top);//可以走则加入对头
}
if (down>=1&&div[down]==-1){//电梯向下,判断是否走过和超界,以免陷入死循环和报错
div[down]=div[poll]+1;//将走过的电梯次数作为标志,而且下一次不能走
queue.add(down);//可以走则加入对头
}
}
return div[b];//如果没有到达则div[b]的值为-1
}
}
想把每一到没有java题解的题解出来分享,想把c++能写的题用java都写一遍,新人作者普通专升本二本,蓝桥杯也只拿过二等奖,不过还是希望在座的各位都能看懂,今年准备冲击蓝桥杯国奖,祝大家也能够参加算法大赛取得不错的成绩
标签:java,int,题解,电梯,new,JAVA,div,poll,P1135 From: https://blog.csdn.net/weixin_67289517/article/details/144154049