奇怪的电梯
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第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<+200,1<=A,B<=N),第二行为N个用空格隔开的正整数,表示Ki。
输出格式
输出文件仅一行,即最少按键次数,若无法到达,则输出-1。
样例输入
5 1 5
3 3 1 2 5
样例输出
3
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class 电梯 { /** * @jl */ public static Scanner sc = new Scanner(System.in); //总楼数 public static int c = sc.nextInt(); //起始点 public static int m = sc.nextInt(); //目的地 public static int n = sc.nextInt(); //构建数组 public static int a[][] = new int[c][c]; public static int count = 0; public static void main(String[] args) { // TODO Auto-generated method stub //给数组赋值 for (int i = 0; i < c; i++) { int x = sc.nextInt(); if(i+x<c){ a[i][i+x]=1; } if(i-x>=0){ a[i][i-x]=1; } } System.out.println( bfs()); } public static int bfs() { // TODO Auto-generated method stub //判断是否访问过 boolean f[] = new boolean[c]; Queue<Integer> q = new LinkedList<Integer>(); //起始节点 if(!f[m - 1]){ q.add(m-1); f[m-1]=true; } while (!q.isEmpty()) { int k = q.poll(); //目的地已到达跳出 if(f[n-1]==true){ break; } else { count++; for (int i = 0; i < c; i++) { //没有访问过并且可以到达 if(!f[i]&&a[k][i]==1){ q.add(i); f[i]=true; } } } } //如果没有访问到 count为-1 if(f[n-1]==false){ count = -1; } return count; } }

浙公网安备 33010602011771号