C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

连通区域由非障碍物 . 或 E 构成;
连通区域中包含的敌人 E 的数量小于限制值 limit。
代码采用 广度优先搜索 (BFS) 方法进行区域探索,以下是具体步骤:

输入解析与初始化:

从输入读取网格的行数、列数、敌人数量限制值 limit 和网格内容。
初始化一个布尔数组 visited,用来记录哪些单元格已经访问过。
连通区域查找与判断:

遍历网格的每个单元格:
如果当前单元格未被访问且不是障碍物,使用 BFS 遍历它所在的连通区域。
在 BFS 过程中统计当前区域内的敌人 E 的数量。
如果敌人数小于 limit,将该区域计入结果。
BFS 实现:

使用队列保存当前连通区域的单元格。
对于每个单元格,检查其上下左右四个方向的相邻单元格是否满足条件(未访问且不是障碍物),如果满足,则加入队列。
在遍历的同时统计敌人 E 的数量。
输出结果:

返回满足条件的连通区域数量

const readline = require("readline");

// 设置输入输出流
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let grid, visited;
let rows, cols, limit;

const data = []; // 用于存储输入数据

rl.on("line", (line) => {
  data.push(line); // 读取每一行输入

  // 第一行解析网格大小和敌人限制值
  if (data.length === 1) {
    [rows, cols, limit] = data[0].split(" ").map(Number);
  }

  // 读取完整的网格数据后,开始计算结果
  if (data.length === rows + 1) {
    grid = data.slice(1); // 网格数据
    visited = Array.from({ length: rows }, () => Array(cols).fill(false)); // 初始化访问标记数组

    // 输出满足条件的连通区域数量
    console.log(findAreas());

    // 清空数据,准备处理下一组输入
    data.length = 0;
  }
});

// 统计满足条件的连通区域数量
function findAreas() {
  let count = 0; // 用于记录满足条件的区域数量

  // 遍历整个网格
  for (let x = 0; x < rows; x++) {
    for (let y = 0; y < cols; y++) {
      // 如果当前单元格未访问且不是障碍物
      if (!visited[x][y] && grid[x][y] !== '#') {
        const enemies = explore(x, y); // 使用 BFS 探索连通区域并统计敌人数
        if (enemies < limit) count++; // 如果敌人数小于限制,计入结果
      }
    }
  }

  return count; // 返回满足条件的连通区域数量
}

// 定义方向数组,用于简化上下左右的相邻单元格访问
const directions = [
  [-1, 0], [1, 0], [0, -1], [0, 1]
];

// 使用 BFS 探索连通区域,并返回区域内敌人的数量
function explore(x, y) {
  let enemyCount = 0; // 当前连通区域中的敌人数
  if (grid[x][y] === 'E') enemyCount++; // 如果起始单元格是敌人,计数加 1

  const queue = [[x, y]]; // 初始化队列
  visited[x][y] = true; // 标记起始单元格为已访问

  // BFS 遍历
  while (queue.length) {
    const [curX, curY] = queue.shift(); // 取出队列中的当前单元格

    // 遍历当前单元格的四个相邻单元格
    for (const [dx, dy] of directions) {
      const newX = curX + dx;
      const newY = curY + dy;

      // 检查相邻单元格是否在网格范围内、未访问且不是障碍物
      if (
        newX >= 0 && newX < rows &&
        newY >= 0 && newY < cols &&
        !visited[newX][newY] &&
        grid[newX][newY] !== '#'
      ) {
        if (grid[newX][newY] === 'E') enemyCount++; // 如果是敌人,计数加 1
        visited[newX][newY] = true; // 标记为已访问
        queue.push([newX, newY]); // 将相邻单元格加入队列
      }
    }
  }

  return enemyCount; // 返回当前连通区域的敌人数
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145143622"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!