1737 -- 卫星图片
Description
Smart得到了他家的卫星图片,图片可分为W×H个方格,"*"表示这个格子是一座建筑,"."表示这个格子是空地。除了在边界上的格子,每个格子在上下左右四个方向上有邻居,如果两个相邻的格子上都有建筑,那么这两个建筑就是连在一起了。Smart想知道,他家最大的一片连续建筑占据了多
【以下回答由 GPT 生成】
问题解决方案如下:
#include <iostream>
#include <fstream>
#include <vector>
// 读取卫星图片数据
std::vector<std::vector<char>> readSatelliteImage(const std::string& filename) {
std::ifstream file(filename);
std::vector<std::vector<char>> image;
std::string line;
if (file) {
while (std::getline(file, line)) {
std::vector<char> row;
for (char c : line) {
row.push_back(c);
}
image.push_back(row);
}
}
return image;
}
// 使用DFS计算最大连续建筑占据的格子数量
int calculateMaxBuildingSize(std::vector<std::vector<char>>& image, int row, int col) {
if (row < 0 || col < 0 || row >= image.size() || col >= image[0].size() || image[row][col] != '*') {
return 0;
}
image[row][col] = '.'; // 将已经计算过的建筑格子标记为".",避免重复计算
int size = 1; // 当前建筑格子的大小,初始为1
// 递归地计算上下左右相邻的建筑格子的大小,并将其加到总大小中
size += calculateMaxBuildingSize(image, row - 1, col); // 上方格子
size += calculateMaxBuildingSize(image, row + 1, col); // 下方格子
size += calculateMaxBuildingSize(image, row, col - 1); // 左方格子
size += calculateMaxBuildingSize(image, row, col + 1); // 右方格子
return size;
}
int main() {
std::string filename = "satellite_image.txt";
std::vector<std::vector<char>> image = readSatelliteImage(filename);
int maxBuildingSize = 0; // 最大连续建筑占据的格子数量
// 遍历所有格子,找到最大的连续建筑占据的格子数量
for (int row = 0; row < image.size(); row++) {
for (int col = 0; col < image[0].size(); col++) {
if (image[row][col] == '*') {
int buildingSize = calculateMaxBuildingSize(image, row, col);
if (buildingSize > maxBuildingSize) {
maxBuildingSize = buildingSize;
}
}
}
}
std::cout << "最大连续建筑占据的格子数量为:" << maxBuildingSize << std::endl;
return 0;
}
希望这个解决方案对你有帮助!如果你有其他问题,请随时提问。