# Water Trapping Problem Solution

Water Trapping is a typical problem that is very commonly used by prospective employers to test your analytical or programming skills. And believe me it is quite tricky!!

## Water Trapping Problem

For this problem, input is an array with number values representing the heights of vertical bars.  The challenge is to return how much water can be stored in the spaces created by a row of vertical bars of equal width.

The logic of the process is to scan from left to right from array storing bars’ heights and calculate the volume of water that can be stored by virtue of the height of current bar compared to other bar making the storage structure.

## Algorithm

``````1.	Initialize LEFT = 0 and RIGHT = N-1
2.	Initialize LEFT_HEIGHT=0 and RIGHT_HEIGHT=0
3.	Repeat steps   4 and 5 while LEFT<RIGHT
4.	If  HEIGHT[LEFT]<HEIGHT[RIGHT]
a.	If HEIGHT[LEFT]>LEFT_HEIGHT then
Update LEFT_HEIGHT= HEIGHT [LEFT]
Else
Update VOL=VOL+ LEFT_HEIGHT- HEIGHT [LEFT]
b.	Increment LEFT
5.	Else
a.	If HEIGHT[RIGHT]>RIGHT_HEIGHT then
Update   RIGHT_HEIGHT=  HEIGHT [RIGHT]
Else
Update VOL=VOL+ RIGHT_HEIGHT- HEIGHT [RIGHT]
b.	Decrement RIGHT
6.	Return VOL  ``````

Description- The algorithm accepts array HEIGHT with N element. Each element of the array represents the height of a vertical bar making the water storage structure.

Let’s assume Array HEIGHT with these values. Indices are from 0 to 6 for values 7 and  9 respectively

The first image shows the initials state of bars for water trapping. The values stored in the HEIGHT array is the heights of the bars in this image

After initialization LEFT=0 , RIGHT=6 and LEFT_HEIGHT=7

In the first iteration LEFT=1,  RIGHT=6 and the volume of water added is LEFT_HEIGHT – HEIGHT [LEFT]  (7-5)=2

In the second iteration LEFT=2,  RIGHT=6 and the volume of water added is LEFT_HEIGHT – HEIGHT[LEFT] (7-1)=6

In the third  iteration LEFT=3,  RIGHT=6 and the volume of water added is LEFT_HEIGHT – HEIGHT[LEFT] (7-6)=1

In the fourth iteration LEFT=4, RIGHT=6 and the volume of water added is LEFT_HEIGHT – HEIGHT[LEFT] (7-5)=2

In the fifth iteration LEFT=5, RIGHT=6 and the volume of water added is LEFT_HEIGHT – HEIGHT[LEFT] (7-0)=7

In the sixth iteration LEFT=6 RIGHT=6 and the volume of water added is 0 since the height of the last bar is greater than height of Left bar. The condition specified in step 3 of the algorithm becomes false and the algorithm is terminated returning the volume of Water Trapping Problem.

##### Solution with C
```#include <stdio.h>
int FindVol(int height[], int num)
{
// Variable declaration
int vol = 0;
//Initialize height variables for two ends
int left_height=0;
int right_height=0;
//Initialize  variables for two ends
int start_ind=0;
int end_ind=num-1;

while(start_ind<=end_ind)
{
if (height[start_ind]<height[end_ind])
{
printf("start_ind=%d, end_id=%d\t",start_ind,end_ind);
if (height[start_ind]>left_height)
{
// update Left taller bar
left_height=height[start_ind];
printf("left_height=%d\t",left_height);
}
else
{
// Calculte volume
vol=vol+left_height-height[start_ind];
}
// Get next bar for comparison
start_ind++;
}
else
{
printf("start_ind=%d, end_id=%d\t",start_ind,end_ind);
if (height[end_ind]>right_height)
{
//Update Right taller bar
right_height=height[end_ind];
printf("right_height=%d\t",right_height);
}
else
{
// Caluclate volume
vol=vol+right_height-height[end_ind];
}
// Get next bar for comparison
end_ind--;
}
printf("\n");
}
return vol;
}
void main()
{
int vol, i,j,k, height[]= {7,5,1,6,5,0,9};
//Diaplay the bar structure for eater trapping
printf("\n\n\t \tTHE WATER TRAPPING PROBLEM \n\n");
for (i=0; i<9;i++)
{
printf("\t\t");
for (j=0; j<=6;j++)
{
if (height[j]-(9-i)<0)
printf("   ");
else
printf("[_]");
}
printf("\n");
}
printf("\t\t");
for (j=0; j<=6;j++)
printf("___");
printf("\n");
printf("Heights of bars:");
for (j=0; j<=6;j++)
printf(" %d ",height[j]);

printf("\n\n For the Above bar Structure \n\n");
//call fucntion to calculate total volume
vol=FindVol(height,7);

printf("\n\nThe total water that will be collected is %d",vol);
}
```

#### Solution with Java

```import java.util.*;
public class WaterTrap {
public static int FindVol(int height[], int num) {
int vol = 0;
int left_height=0;
int right_height=0;
int start_ind=0;
int end_ind=num-1;

while(start_ind<=end_ind)
{
if (height[start_ind]<height[end_ind])
{
if (height[start_ind]>left_height)
left_height=height[start_ind];
else
vol=vol+left_height-height[start_ind];
start_ind++;
}
else
{
if (height[end_ind]>right_height)
right_height=height[end_ind];
else
vol=vol+right_height-height[end_ind];
end_ind--;
}

}
return vol;
}
public static void main(String args[]) {
int[] height= {5,3,1,2,5,0,4};
System.out.println(FindVol(height,height.length));
}
}```

#### Solution with Python

```#Function to calculate volume of water that can be trapped
def FindVol( height, num):
#initialise variable
vol = 0
left_height=0
right_height=0
start_ind=0
end_ind=num-1
while(start_ind<end_ind):
# compare heights of left and right bars
if (height[start_ind]<height[end_ind]):
if (height[start_ind]>left_height):
#update new left higher bar
left_height=height[start_ind]
else:
# calculate volume between left bar and current bar
vol=vol+left_height-height[start_ind]
#update left bar index
start_ind=start_ind+1
else:
if (height[end_ind]>right_height):
#update new right higher bar
right_height=height[end_ind];
else:
# calculate volume between right bar and current bar
vol=vol+right_height-height[end_ind]
#update right bar index
end_ind=end_ind-1

return vol

height= []
i=0
#Read the count of bars to be stored
n=int(input("Number of elements you want to add--->"))
while i<n:
height.append(int(input("input value--->")))
i=i+1

print(FindVol(height,n))
```

Note: We have used arrays that are initialized in the C and Java Code. You can modify to get the array values form user.