编辑代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // 读取输入参数:矩阵的行数n、列数m和阈值k
  const [n, m, k] = (await readline()).split(" ").map(Number);

  // 读取矩阵数据
  const matrix = [];
  for (let i = 0; i < n; i++) {
    matrix.push((await readline()).split(" "));
  }

  let ans = 0; // 记录满足条件的连通区域数量

  // 创建访问标记数组,用于记录已访问的位置
  const visited = new Array(n).fill(0).map(() => new Array(m).fill(false));

  /**
   * BFS函数:检查从(i,j)开始的连通区域是否满足条件
   * @param {number} i - 起始位置的行坐标
   * @param {number} j - 起始位置的列坐标
   * @returns {boolean} - 如果连通区域中'E'的数量小于k,返回true
   */
  const bfs = (i, j) => {
    let count = 0; // 记录当前连通区域中'E'的数量

    // 检查起始位置是否为'E'
    if (matrix[i][j] == "E") {
      count++;
    }

    // 标记起始位置为已访问
    visited[i][j] = true;

    // 初始化BFS队列,加入起始位置
    const queue = [[i, j]];

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

    // BFS主循环
    while (queue.length > 0) {
      // 取出队列中的第一个位置
      const [x, y] = queue.shift();

      // 向四个方向扩展
      for (const [dx, dy] of offsets) {
        const newX = x + dx;
        const newY = y + dy;

        // 检查新位置是否有效:
        // 1. 不越界
        // 2. 不是墙('#')
        // 3. 未被访问过
        if (
          newX >= 0 &&
          newX < n &&
          newY >= 0 &&
          newY < m &&
          matrix[newX][newY] !== "#" &&
          !visited[newX][newY]
        ) {
          // 标记新位置为已访问
          visited[newX][newY] = true;
          // 将新位置加入队列
          queue.push([newX, newY]);
          // 如果新位置是'E',增加计数
          if (matrix[newX][newY] == "E") {
            count++;
          }
        }
      }
    }

    // 返回是否满足条件('E'的数量小于k)
    return count < k;
  };

  // 遍历矩阵的每个位置
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      // 如果当前位置未被访问且不是墙,进行BFS
      if (!visited[i][j] && matrix[i][j] !== "#") {
        // 如果BFS返回true,说明该连通区域满足条件,增加答案计数
        if (bfs(i, j)) ans++;
      }
    }
  }

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