欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度优先和广度优先

程序员文章站 2022-03-03 11:18:24
...

1.钥匙和房间

(力扣题目)
有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。

对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。
最初,除 0 号房间外的其余所有房间都被锁住。
你可以*地在房间之间来回走动。
如果能进入每个房间返回 true,否则返回 false。

示例 1:

输入: [[1],[2],[3],[]]
输出: true
解释:
我们从 0 号房间开始,拿到钥匙 1。
之后我们去 1 号房间,拿到钥匙 2。
然后我们去 2 号房间,拿到钥匙 3。
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true。

示例 2:
输入:[[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。

深度优先

import java.util.List;

public class Solution {
	static int n;
	static boolean[] vis;
	static int num;
	
	public static boolean visitRooms(List<List<Integer>> rooms) {
		//房间数
		n = rooms.size();
		num = 0;
		vis = new boolean[n]; //用于记录房间访问状态
		dfs(rooms, 0);  //深度优先搜索
		return num==n;
	}
	
	public static void dfs(List<List<Integer>> rooms, int x) {
		//变更访问状态
		vis[x] = true;
		num++;  //记录访问的房间数
		for(int i:rooms.get(x)) { //拿出房间的钥匙
			if(!vis[i]) {
				dfs(rooms, i);
			}
		}
	}
}

广度优先

import java.util.LinkedList;
import java.util.List;

public class Solution {
	static int n;
	static boolean[] vis;
	static int num;

	public static boolean visitRooms(List<List<Integer>> rooms) {
		// 房间数
		n = rooms.size();
		num = 0;
		vis = new boolean[n]; // 用于记录房间访问状态
		LinkedList<Integer> que = new LinkedList<Integer>();

		vis[0] = true; // 初始化第0个房间
		que.offer(0); // 两者都是往队列尾部插入元素
		while (!que.isEmpty()) {
			int x = que.poll(); // 移除第一个元素
			num++;
			for (int i : rooms.get(x)) {
				if (!vis[i]) {
					vis[i] = true;
					que.offer(i);
				}
			}
		}

		return num == n;

	}

}