加载中...

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;
	}
}
posted @ 2023-03-12 15:31  ChuenSan  阅读(12)  评论(0编辑  收藏  举报