深度优先和广度优先
程序员文章站
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;
}
}
上一篇: 深度优先和广度优先
下一篇: 图论—深度优先和广度优先算法源码