0
点赞
收藏
分享

微信扫一扫

leetcode Walls and Gates

乱世小白 08-04 09:00 阅读 40

问题描述

给定一个房间的二维网格,其中每个房间可以是空的(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
举报

相关推荐

0 条评论