问题描述
给定一个房间的二维网格,其中每个房间可以是空的(0)或墙(1)。你需要使用机器人来打开所有空房间的门。机器人可以向上、下、左、右四个方向移动,但是不能穿过墙。机器人从房间左上角的房间(0, 0)开始移动。
每当机器人进入一个空房间(即0),它会打开门,变成2,然后机器人可以进入下一个房间。不需要对墙(1)进行操作。
最后,所有空房间的门都打开了,我们需要返回最终的结果。
示例 1: 输入: 房间 = [[2, 2, 3], [1, 5, 0], [3, 2, 1]] 输出: [[2, 2, 3], [2, 5, 2], [2, 2, 2]]
示例 2: 输入: 房间 = [[0], [2]] 输出: [[2], [2]]
示例 3: 输入: 房间 = [[0, 0], [2, 2]] 输出: [[2, 2], [2, 2]]
示例 4: 输入: 房间 = [[0, 1], [1, 0]] 输出: [[2, 1], [1, 2]]
提示:
m == rooms.length
n == rooms[i].length
1 <= m, n <= 200
rooms[i][j]
要么是0
,要么是1
。- 至少有一个空房间。
- 房间左上角的房间是空的。
- 机器人的初始方向向上。
解法一
解题思路:
使用广度优先搜索(BFS)算法。从左上角的房间(0, 0)开始,将其加入队列。然后,不断从队列中取出房间,将其四个方向的房间加入队列,直到队列为空。
/*
* @lc app=leetcode.cn id=286 lang=javascript
*
* [286] Walls and Gates
*/
// @lc code=start
function wallsAndGates(rooms) {
const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];
const queue = [];
if (rooms[0][0] === 0) {
queue.push([0, 0]);
rooms[0][0] = 2;
}
while (queue.length) {
const [x, y] = queue.shift();
for (let [dx, dy] of dirs) {
const nx = x + dx;
const ny = y + dy;
if (nx >= 0 && nx < rooms.length && ny >= 0 && ny < rooms[0].length && rooms[nx][ny] === 0) {
queue.push([nx, ny]);
rooms[nx][ny] = rooms[x][y] + 1;
}
}
}
}
// @lc code=end