首页 > 代码库 > 水池问题

水池问题

看下面这个图片

在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6], 假如开始下雨了,那么墙之间的水坑能够装多少水呢?

解法:

1.第一轮循环:从左到右, 找到依次递增的最大的数字A, 然后继续向右, 找到最后一个不大于A的数字B, 计算数字A和数字B之间的水量, 然后重复上述步骤;

2.第二轮循环:从右到左, 重复上述步骤;

 1 #include <iostream> 2 using namespace std; 3  4 int Volume(int* vArr, int vSize); 5 int Cal(int* vArr, int vLeft, int vRight); 6  7 int Volume(int* vArr, int vSize) 8 { 9     int lLeft, lRight, rLeft, rRight;10     int nValue = http://www.mamicode.com/0;11     int i, j;12 13 14     for (i = 0; i < vSize - 1; ++i)15     {16         if (vArr[i] <= vArr[i + 1])17         {18             continue;19         }20         lLeft = i;21         for (j = lLeft + 1; j < vSize; ++j)22         {23             if (vArr[j] <= vArr[lLeft])24             {25                 continue;26             }27             lRight = j;28             nValue += Cal(vArr, lLeft, lRight);29             break;30         }31         if ( j != vSize )32         {33             i = lRight - 1;34         }35         else36         {37             break;38         }39     }40 41 42     for (i = vSize - 1; i > 0; --i)43     {44         if (vArr[i] <= vArr[i - 1])45         {46             continue;47         }48         rRight = i;49         for (j = rRight - 1; j >= 0; --j)50         {51             if (vArr[j] <= vArr[rRight])52             {53                 continue;54             }55             rLeft = j;56             nValue += Cal(vArr, rLeft, rRight);57             break;58         }59         if ( j != 0 )60         {61             i = rLeft + 1;62         }63         else64         {65             break;66         }67     }68 69     return nValue;70 }71 72 int Cal(int* vArr, int vLeft, int vRight)73 {74     int nMin;75     int nValue = http://www.mamicode.com/0;76     int tmp;77 78     nMin = (vArr[vLeft] < vArr[vRight]) ? vArr[vLeft] : vArr[vRight];79     for (int i = vLeft; i < vRight; ++i)80     {81         tmp = nMin - vArr[i];82         if ( tmp > 0 )83             nValue += tmp ;84     }85 86     return nValue;87 }88 89 90 int main()91 {92     int arr[] = {2,5,1,3,1,2,1,7,7,6};93 94     cout << Volume(arr, sizeof(arr) / sizeof(int)) << endl;95     return 0;96 }

 

水池问题