P1135 奇怪的电梯
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5代表了Ki(K1=3,K2=3,…),从1楼开始。在1楼,按“上”可以到4楼,按“下”是不起作用的,因为没有−2楼。那么,从A楼到B楼至少要按几次按钮呢?
输入格式
共二行。
第一行为3个用空格隔开的正整数,表示N,A,B(1≤N≤200,1≤A,B≤N)。
第二行为N个用空格隔开的非负整数,表示Ki。
输出格式
一行,即最少按键次数,若无法到达,则输出−1。
输入输出样例
输入 #1
5 1 5
3 3 1 2 5
输出 #1
3
思路:bfs,对当前的楼层来说有3种情况,1.到达了目标楼层,2.没到达目标楼层,向上走nums[i]层,3.没到达目标楼层,向下走nums[i]层.
import java.util.LinkedList;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int a = in.nextInt();
int b = in.nextInt();
int[]nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = in.nextInt();
}
int min = Integer.MAX_VALUE;
Map<Integer, Integer>mp = new HashMap();//存放楼层的访问次数
Queue<Integer>queue = new LinkedList<Integer>();
Queue<Integer>step = new LinkedList<Integer>();
queue.offer(a);
step.offer(0);
while(!queue.isEmpty()) {
int cur = queue.poll();//当前层数
int steps = step.poll();
//如果当前楼层已经访问过continue;
if(mp.containsKey(cur))
continue;
else
mp.put(cur, steps);
if(cur == b) {//到达目标楼层
min = steps;
break;
}
int[]choice = {-1,1};
for(int i = 0; i < 2; i++) {
//有俩种选择,向上走nums[cur-1]步或者向下走nums[cur-1]步
int current = cur + choice[i] * nums[cur - 1];
if(current < 1 || current > n) { //电梯楼层不能超出所给的楼层范围
continue;
}else {
queue.offer(current);
step.offer(steps + 1);
}
}
}
if(min == Integer.MAX_VALUE) {
System.out.print(-1);
}else
System.out.print(min);
}
}