# Minimizing water collection distance in javaT village

In javaT village is represented by a grid of characters denoting houses, wells, open ground, and prohibited areas ('H', 'W', '.', and 'N' respectively). The task is determining the shortest distance each house needs to traverse to access water from the nearest well and return.

Within this village grid of size n*m, inhabitants residing in houses marked 'H' are occupied with tasks and require water from the wells marked 'W'. The goal is to calculate the minimum distance for each house to travel to the closest well and back, considering movements restricted to left, right, up, and down within the grid boundaries.

For example, if the village is laid out in a 3x3 grid with 'H' standing for homes and 'W' for wells, the output shows the shortest distance each house has to go to get to the closest well and back. There might be a minimum of 4 units between homes positioned in the corners and the well, 2 units between buildings that are not in the corners and the well, or 1 unit between houses in the corners and 2 units back.

In another scenario, considering a 5x5 grid with houses, prohibited areas, and wells, the output illustrates the minimum distances each house needs to travel. Some houses might not have access to any well due to surrounding prohibited areas ('N'), resulting in a distance of -1. Other houses would follow a strategy similar to the earlier example to calculate the minimum travel distances.

The challenge is to create an algorithm that efficiently computes these minimum distances, accounting for the presence of prohibited areas and determining the shortest path for each house to access the nearest well and return within the village grid.

## Test Cases

Test Case 1:

• Input:
• Grid size: 4x4
• Grid Representation:
{{H, ., H, H},
{H, W, H, H},
{., H, ., H},
{H, H, H, H}}
• Output
2 0 2 2
0 0 2 2
2 2 2 2
2 2 2 2
• Explanation
• In this scenario, 'H' represents houses, 'W' represents wells, and '.' denotes open ground.
• The output illustrates the minimum distances each house must travel to reach the nearest well and return.
• Houses adjacent to the well have a minimum distance of 2 (1 unit to the well and 1 unit back). The house adjacent to the open ground directly connected to the well also has a minimum distance of 2.
• The rest of the houses have a minimum distance of 0 as they are already adjacent to a well.

Test Case 2:

• Input:
• Grid size: 3x3
• Grid Representation:
{{H, N, H},
{H, H, W},
{., H, .}}
• Output:
4 0 2
2 2 0
2 0 2
• Explanation:
• Here, 'H' represents houses, 'W' denotes wells, '.' signifies open ground, and 'N' marks prohibited areas.
• The output showcases the minimum distances each house needs to travel to access the nearest well and return.
• The house at the corner has a minimum distance of 4 (2 units to the well and 2 units back).
• Houses adjacent to the well have a minimum distance of 2 (1 unit to the well and 1 unit back).
• The remaining houses that can access the well directly have a minimum distance of 0.

## Algorithm Used to Solve This Question

To solve this problem efficiently, you can use a modified version of the Breadth-First Search (BFS) algorithm:

1. Initialize:
• Create a distance matrix initialized with maximum values for all cells equal to the grid size.
• Create a queue to perform BFS.
2. Identify Wells:
• Locate all wells in the grid and mark their positions.
3. Perform BFS:
• For each well identified:
• Start BFS from the well's position.
• Explore adjacent cells (left, right, up, down) while keeping track of the distances.
• Update the distance matrix with the minimum distance from the well to each cell.
• Continue until all reachable cells from the well are visited.
4. Calculate House Distances:
• Iterate through each house in the grid.
• For each house, check its distance from the nearest well using the distance matrix created in step 3.
• Update the minimum distance for each house to reach the nearest well and return.
5. Handle Prohibited Areas:
• If prohibited areas ('N') exist, ensure those cells are not considered during BFS traversal. You can mark these cells as visited or disregard them while computing distances.
6. Output:
• Generate the matrix showing the minimum distances each house needs to travel to access the nearest well and return.

### Algorithm Notes:

• This algorithm ensures that each cell in the grid is visited at most once during the BFS traversal from each well.
• It accounts for the directions of restricted movement and avoids prohibited areas while calculating distances.
• Using BFS helps efficiently compute the shortest distances from the wells to all reachable cells in the grid.
• After creating the distance matrix, calculating distances from houses to wells becomes a straightforward lookup process using the precomputed distances.

Output:

Explanation:

Functions:s

1. shortest_distance_village() - The main function to find the shortest distance grid

Parameters:

1. n - Number of rows in the grid
2. m - Number of columns in the grid
3. grid- The 2D grid as input

Variables:

1. res- Output 2D grid to store shortest distances
• Initialized as float('inf') for all cells
2. q- Queue to maintain BFS traversal order
• Implemented using deque
3. dx[] - Offsets in x-direction for 4 neighbors
4. dy[]- Offsets in y direction for 4 neighbors
5. curx, cury- Current cell coordinates
6. x, y- Neighbor cell coordinates

Working:

1. Import deque from collections. This will be used as a queue for BFS traversal.
2. Define the shortest_distance_village() function, which takes the grid dimensions n, m and the grid itself as arguments.
3. Create a 2D array res to store the final shortest distances. Initialize all cells to infinity.
4. Create a deque q to use as a queue.
5. Iterate through the grid and find all 'W' cells. Put their coordinates into q and set their distance in res to 0.
6. Define dx and dy arrays to get 4 neighbour offsets.
7. Start BFS traversal:
• Pop a cell from q and get its x,y coordinates
• Check the 4 neighbors with offsets
• If the neighbour is valid, in bounds, not 'N', and its current res value > curr + 1:
• Append neighbor to q
• Update its distance to curr dist + 1
8. After BFS, fill res:
• '.' cells get 0 dist
• 'N' cells keep infinity
• Other cells not reached get -1
• Multiply distances of reached cells by 2
9. Return the res grid of the shortest distances
10. Driver code defines a sample input, calls the function, and prints the output grid.

## Conclusion:

Within a village grid, it is critical to compute the shortest pathways for dwellings to reach neighbouring wells as efficiently as possible. These ideal routes are found using algorithms such as BFS, which consider places that are off-limits and mobility constraints. The programme guarantees households can access water sources with short travel distances by methodically calculating these itineraries, improving village efficiency.