城堡问题(深搜)--算法学习
发布日期:2021-05-15 00:28:04 浏览次数:24 分类:精选文章

本文共 1918 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要计算城堡中房间的数量以及最大房间的面积。每个房间由连通的方块组成,我们可以使用深度优先搜索(DFS)来遍历每个连通区域,从而确定房间的数量和大小。

方法思路

  • 输入处理:读取输入数据,包括城堡的行数和列数,以及每个方块周围墙的信息。
  • 初始化:创建一个二维数组来记录每个方块是否已经被访问过。
  • 深度优先搜索(DFS):从每个未访问的方块开始,进行DFS,标记所有连通的方块,计算该房间的面积。
  • 统计结果:记录房间的数量和最大房间的面积。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;
    int R, C;
    int rooms[R+1][C+1];
    int color[R+1][C+1] = {0};
    int maxRoomArea = 0;
    int roomNum = 0;
    int currentArea = 0;
    void dfs(int i, int j) {
    if (i < 1 || i > R || j < 1 || j > C) {
    return;
    }
    if (color[i][j] != 0) {
    return;
    }
    color[i][j] = roomNum;
    int area = 1;
    // 检查西墙
    if ((rooms[i][j] & 1) == 0) {
    area += dfs(i, j - 1);
    }
    // 检查北墙
    if ((rooms[i][j] & 2) == 0) {
    area += dfs(i - 1, j);
    }
    // 检查东墙
    if ((rooms[i][j] & 4) == 0) {
    area += dfs(i, j + 1);
    }
    // 检查南墙
    if ((rooms[i][j] & 8) == 0) {
    area += dfs(i + 1, j);
    }
    if (area > maxRoomArea) {
    maxRoomArea = area;
    }
    return area;
    }
    int main() {
    // 读取输入
    cin >> R >> C;
    for (int i = 1; i <= R; ++i) {
    for (int j = 1; j <= C; ++j) {
    cin >> rooms[i][j];
    }
    }
    // 初始化
    roomNum = 0;
    maxRoomArea = 0;
    // 遍历每个方块
    for (int i = 1; i <= R; ++i) {
    for (int j = 1; j <= C; ++j) {
    if (color[i][j] == 0) {
    roomNum++;
    currentArea = dfs(i, j);
    if (currentArea > maxRoomArea) {
    maxRoomArea = currentArea;
    }
    }
    }
    }
    // 输出结果
    cout << roomNum << endl;
    cout << maxRoomArea << endl;
    return 0;
    }

    代码解释

  • 输入处理:读取行数和列数,然后读取每个方块的墙信息。
  • 初始化color数组用于记录每个方块是否被访问过。
  • DFS函数:从每个未访问的方块开始,使用递归来遍历所有连通的方块,标记颜色并计算房间的面积。
  • 遍历方块:对于每个未访问的方块,调用DFS函数,统计房间数量和最大房间面积。
  • 输出结果:打印房间数量和最大房间面积。
  • 这个方法通过DFS遍历每个连通区域,确保正确统计房间数量和最大面积,适用于题目给定的城堡地形图。

    上一篇:抓住那头牛(广搜)--算法学习
    下一篇:深度优先搜索--算法学习

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月28日 03时53分26秒