当前位置: 代码迷 >> 综合 >> P1135 奇怪的电梯
  详细解决方案

P1135 奇怪的电梯

热度:72   发布时间:2024-02-01 08:27:33.0

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 stubScanner 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);}elseSystem.out.print(min);}}