以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
这是一个典型的二维数组处理问题,可以通过遍历二维数组,统计满足条件的区域数量来解决。我们可以使用深度优先搜索(DFS)算法来遍历每个区域,判断其是否被围墙包围。以下是C++的解题代码:
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100; // 最大大小
vector<vector<int>> graph; // 二维数组
int countZero = 0; // 统计未被洪水淹没的重要区域数量
int x, y; // 行数和列数
void dfs(int i, int j) { // DFS函数,用于遍历每个区域
if (i < 0 || i >= x || j < 0 || j >= y || graph[i][j] != 0) return; // 越界或者不是围墙直接返回
graph[i][j] = 1; // 标记为已访问过(此时被视为已被围墙包围)
dfs(i + 1, j); // 下
dfs(i - 1, j); // 上
dfs(i, j + 1); // 右
dfs(i, j - 1); // 左
}
int main() {
cin >> x >> y; // 输入行数和列数
graph.resize(x, vector<int>(y)); // 创建二维数组并初始化大小
for (int i = 0; i < x; ++i) { // 输入二维数组内容
for (int j = 0; j < y; ++j) {
cin >> graph[i][j];
}
}
for (int i = 0; i < x; ++i) { // 对每个未被标记的区域进行DFS搜索,判断是否被围墙包围
for (int j = 0; j < y; ++j) {
if (graph[i][j] == 0 && graph[i][j] != 1) { // 如果当前位置是未被标记的围墙(即未被访问过)且为重要区域(值为0)则进行DFS搜索
dfs(i, j); // 从该位置开始DFS搜索周围是否被围墙包围的区域
countZero++; // 更新未被淹没的区域数量(+1)
}
}
}
cout << countZero << endl; // 输出未被淹没的重要区域数量
return 0;
}
上述代码中,首先定义了一个二维数组graph来存储输入数据,然后使用深度优先搜索算法遍历每个区域,判断其是否被围墙包围。如果一个区域被围墙包围(即四个方向都被围墙包围),则将其标记为已访问过(此时视为已被围墙包围),并更新未被淹没的重要区域数量。最后输出未被淹没的重要区域数量即可。