例如:
木板高度:1,2,3,1---- 11 + 21 + 11 = 4 水量
木板高度:1,2,1,4---- 11 + 22 = 3 水量
木板高度:2,1,3---- 22 = 4 水量
木板高度:4,2,3,1-- 32 + 11 = 7 水量
基本思路:
以最大的数为中间数,分开计算;
当指针运动到下一个比a大的数或者运动到max地址的时候停止;
源代码:
#define n 10
#include <stdio.h>
int main(int argc, char *argv[])
{
int h[n] = {4,2,3,5,2,5,3,5,5,2}; //测试数组
int *pstart = h; //数组首位
int *pend = pstart + n - 1; //数组尾位
int *pmax = pstart; //用于存储数组最大的数的地址,初始化为第一个数
int *p; //定义跑动的指针并
while(p != pend) //得到最大的数
{
if(*pmax < *p)
pmax = p;
p++;
}
//printf("max=%d, %p\n", *pmax, pmax);
p = pstart; //初始化为第一个数
int a = *p; //临时变量,存放当前地址的值
int b = 0; //临时变量,存放下一个地址的值
int count = 1; //计数a和b之间的宽度
int sum = 0; //用于存放结果
while(p != pmax) //计算max之前存储的水量
{
a = *p;
count = 1;
while(a > *(p+1) && p+1 != pmax)
{
count++;
p++;
}
p++; //让p开始跑动
b = *p;
if(a <= b)
sum = sum + a * count;
else
sum = sum + b * count;
//printf("sum=%d\n",sum);
}
p = pend; //将p移动到数组最后
b = 0;
while(p != pmax) //计算max之后存储的水量
{
a = *p;
count = 1;
while(a > *(p-1) && p-1 != pmax)
{
count++;
p--;
}
p--;
b = *p;
if(a <= b)
sum = sum + a * count;
else
sum = sum + b * count;
//printf("sum=%d\n",sum);
}
printf("sum=%d\n",sum);
}