P1135 奇怪的电梯
P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这是一道bfs
public class P1135 {
static Node[] fs = new Node[205];// 数据最大为 200 开一个稍微大一点点的数组
static int n;// 总楼层数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
int a = scanner.nextInt();
int b = scanner.nextInt();
for (int i = 1; i <= n; i++) {
int x = scanner.nextInt();
fs[i] = new Node(i, -1, 0, i - x, i + x);// 对楼层进行初始化
}
bfs(a, b);
}
private static void bfs(int a, int b) {
LinkedList<Node> linkedList = new LinkedList<>();
fs[a].step = 0;
fs[a].isVis = 1;
Node t = new Node(b, b, b, a, b);
linkedList.addLast(fs[a]);
while (!linkedList.isEmpty()) {
t = linkedList.removeFirst();
if (t.d >= 1 && t.d <= n && fs[t.d].isVis == 0) {
fs[t.d].step = t.step + 1;
fs[t.d].isVis = 1;
linkedList.addLast(fs[t.d]);
}
if (t.u >= 1 && t.u <= n && fs[t.u].isVis == 0) {
fs[t.u].step = t.step + 1;
fs[t.u].isVis = 1;
linkedList.addLast(fs[t.u]);
}
if (t.u == b || t.d == b)
break;// 优化可加可不加,差不了多少
}
System.out.println(fs[b].step);
}
}
class Node {
int id;
int step;
int isVis;
int d;
int u;
/**
* 楼层节点构造方法
*
*
* @param id 楼层号
* @param step 到达该楼层需要的步数
* @param isVis 标记该楼层是否被访问过
* @param d 该楼层下降后的楼层号(可能为负)
* @param u 该楼层上升后的楼层号(可能为负)
*/
public Node(int id, int step, int isVis, int d, int u) {
super();
this.id = id;
this.step = step;
this.isVis = isVis;
this.d = d;
this.u = u;
}
}