编辑代码

// 设置标准输入接口
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// 问题描述:给定一个二维矩阵,从(0,0)出发,求无法到达的格子数量
// 输入格式:第一行两个整数 row tate 表示矩阵的行数和列数
// 后面row行,每行tate个数字,表示矩阵内容(0表示可通过,1表示障碍)
// 输出格式:一个整数,表示无法到达的格子数量

void (async function () {
  // 读取矩阵的行数和列数
  const [row, tate] = (await readline()).split(" ").map(Number);

  // 读取矩阵内容
  const matrix = [];
  for (let i = 0; i < row; i++) {
    matrix.push((await readline()).split(" ").map(Number));
  }

  // 记录无法到达的格子数量
  let res = 0;

  // 广度优先搜索函数,用于标记从起点可以到达的所有格子
  const bfs = (i, j) => {
    // 初始化队列,存放待访问的格子坐标
    const queue = [[i, j]];

    // 定义四个方向的偏移量:上、下、左、右
    const offsets = [
      [-1, 0], // 上
      [1, 0], // 下
      [0, 1], // 右
      [0, -1], // 左
    ];

    // BFS主循环
    while (queue.length > 0) {
      // 取出队首元素
      const [x, y] = queue.shift();

      // 遍历四个方向
      for (const [dx, dy] of offsets) {
        // 计算新的坐标
        const nx = x + dx;
        const ny = y + dy;

        // 检查新坐标是否有效:
        // 1. 不超出矩阵边界
        // 2. 是可通过的格子(值为0)
        if (
          nx >= 0 &&
          nx < row &&
          ny >= 0 &&
          ny < tate &&
          matrix[nx][ny] == 0
        ) {
          // 标记该格子已访问(将值改为1)
          matrix[nx][ny] = 1;
          // 将新坐标加入队列
          queue.push([nx, ny]);
        }
      }
    }
  };

  // 从起点(0,0)开始进行BFS
  bfs(0, 0);

  // 统计矩阵中所有无法到达的格子
  // 遍历整个矩阵,如果某个格子的值不为1,说明无法到达
  for (let i = 0; i < row; i++) {
    for (let j = 0; j < tate; j++) {
      if (matrix[i][j] !== 1) res++;
    }
  }

  // 输出结果
  console.log(res);
})();