水池问题

看下面这个图片

在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[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 = 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         else
36         {
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         else
64         {
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 = 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 }

 

posted @ 2014-12-09 21:43  花开花落知几许  阅读(263)  评论(0编辑  收藏  举报