c语言实现接雨水问题
时间: 2024-09-07 18:05:05 浏览: 18
在 C 语言中,接雨水问题通常是一个经典的二维数组(矩阵)遍历和动态规划问题。该问题是这样的:给定一个 n x n 的矩阵,表示一个屋顶的轮廓,每行每列都是从左到右递增或递减的。你需要计算从每个单元格开始,沿上、下、左、右四个方向可以收集到的最大雨水量。
下面是一个简单的 C 语言函数示例,使用嵌套循环和临时变量来解决这个问题:
```c
#include <stdio.h>
int maxRainwater(int matrix[n][n], int m) {
int i, j, max = 0;
for (i = 0; i < m; i++) { // 遍历每一行
for (j = 0; j < m; j++) { // 内层循环遍历每一列
if (matrix[i][j] > 0) { // 如果当前位置有水
int left = 0, right = 0, top = 0, bottom = 0;
if (j > 0 && matrix[i][j - 1] > 0) // 左侧是否有水
top = matrix[i][j] - matrix[i][j - 1];
else
top = matrix[i][j];
if (j < m - 1 && matrix[i][j + 1] > 0) // 右侧是否有水
bottom = matrix[i][j + 1] - matrix[i][j];
else
bottom = matrix[i][j];
if (i > 0 && matrix[i - 1][j] > 0) // 上方是否有水
left = matrix[i - 1][j] - matrix[i][j];
else
left = matrix[i][j];
if (i < m - 1 && matrix[i + 1][j] > 0) // 下方是否有水
right = matrix[i + 1][j] - matrix[i][j];
else
right = matrix[i][j];
max = ((max > top) ? max : top); // 更新最大值
max = ((max > bottom) ? max : bottom);
max = ((max > left) ? max : left);
max = ((max > right) ? max : right);
}
}
}
return max;
}
// 示例
int main() {
int matrix[3][3] = {{0, 1, 0}, {1, 0, 1}, {0, 1, 0}};
printf("Maximum rainwater that can be collected: %d\n", maxRainwater(matrix, 3));
return 0;
}
```