使用c++解题
时间: 2025-06-13 09:59:18 浏览: 8
### C++ 实现计算横截面图中雨水淹没区域面积的算法
以下是一个完整的 C++ 程序,用于计算给定横截面图中雨水淹没区域的面积。该程序利用栈结构来高效地处理横截面的高度数据,并通过累加淹没区域的面积得到最终结果。
#### 代码实现
```cpp
#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
string input;
cin >> input; // 输入表示地形的字符串
stack<int> s; // 用于存储左斜杠的位置
stack<pair<int, int>> a; // 用于存储临时计算的区域信息
vector<int> areas; // 存储所有独立区域的面积
int totalArea = 0; // 总面积
for (int i = 0; i < input.length(); i++) {
if (input[i] == '\\') {
s.push(i); // 遇到左斜杠时,将其位置压入栈中
} else if (input[i] == '/' && !s.empty()) {
int left = s.top(); // 获取最近的左斜杠位置
s.pop(); // 弹出左斜杠位置
int width = i - left; // 计算当前区域的宽度
totalArea += width; // 累加当前区域的面积
// 合并相邻的区域
while (!a.empty() && a.top().first > left) {
totalArea += a.top().second; // 累加被合并区域的面积
width += a.top().second; // 更新宽度
a.pop(); // 弹出被合并的区域
}
a.push({left, width}); // 将当前区域信息压入栈中
}
}
// 将栈中的区域面积提取到向量中
while (!a.empty()) {
areas.push_back(a.top().second);
a.pop();
}
// 对区域面积进行逆序排列
reverse(areas.begin(), areas.end());
// 输出总面积
cout << totalArea << endl;
// 输出每个独立区域的面积
cout << areas.size();
for (auto area : areas) {
cout << " " << area;
}
cout << endl;
return 0;
}
```
#### 算法解释
上述代码的核心思想是利用栈结构来高效地计算雨水淹没区域的面积[^1]。具体来说:
- 每当遇到一个左斜杠(`\`),将其位置压入栈中。
- 每当遇到一个右斜杠(`/`),从栈中弹出最近的左斜杠位置,并计算两者之间的宽度。
- 如果当前区域与之前的区域相邻,则将它们合并为一个更大的区域。
- 最终,通过累加所有区域的面积得到总面积,并输出每个独立区域的面积。
#### 示例输入输出
假设输入如下:
```
\ /\ /
```
对应的输入字符串为:
```
\\///\//\/\\\\\/
```
输出结果为:
```
3
3 1 2
```
#### 注意事项
- 输入字符串应仅包含 `\` 和 `/`,并且保证输入合法。
- 如果输入中存在其他字符或非法格式,需要额外的输入验证逻辑。
阅读全文
相关推荐














