PROBLEM DESCRIPTION
:

Geologists sometimes
divide an area of land into different regions based on where rainfall flows
down to. These regions are called *drainage basins*.

Given an elevation map
(a 2-dimensional array of altitudes), label the map such that locations in the
same drainage basin have the same label, subject to the following rules.

- From each cell, water flows
down to at most one of its 4 neighboring cells.
- For each cell, if none of its 4
neighboring cells has a lower altitude than the current cell's, then the
water does not flow, and the current cell is called a
*sink*.
- Otherwise, water flows from the
current cell to the neighbor with the lowest altitude.
- In case of a tie, water will
choose the first direction with the lowest altitude from this list: North,
West, East, South.

Every
cell that drains directly or indirectly to the same sink is part of the same
drainage basin. Each basin is labeled by a unique lower-case letter, in such a
way that, when the rows of the map are concatenated from top to bottom, the
resulting string is lexicographically smallest. (In particular, the basin of
the most North-Western cell is always labeled 'a'.)

**SOLUTION:**

public class water_shield1 {
static int val1 = 0,row = 3,col = 3;
/*static int input[][] = {{1,2,3,4,5},{2,9,3,9,6},{3,3,0,8,7},{4,9,8,9,8},{5,6,7,8,9}};
/*static int input1[][] = {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};
static int input2[][] = {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};*/
static int input[][] = {{9,6,3},{5,9,6},{3,5,9}};
/*static int input[][] = {{1,2,3},{4,5,6},{7,8,9}};*/
static int input1[][] = {{0,0,0},{0,0,0},{0,0,0}};
static int input2[][] = {{0,0,0},{0,0,0},{0,0,0}};
/*static int input[][] = {{8,8,8,8,8,8,8,8,8,8,8,8,8},{8,8,8,8,8,8,8,8,8,8,8,8,8}};
static int input1[][] = {{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0}};
static int input2[][] = {{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0}};*/
public static void main(String args[]) {
//water_shield1 w = new water_shield1();
int max = input[0][0],min = input[0][0];
int i1 = 0,j1 = 0,count = 0;
for(int i=0;i input[i][j]) {
min= input[i][j];
}
}
}
for(int t=0;t=0) {
min_ard = input[i][j-1];
a = i;
b = j-1;
}
if((i-1)>=0 && min_ard > input[i-1][j]) {
min_ard = input[i-1][j];
a = i-1;
b = j;
}
if((i+1) input[i+1][j]) {
min_ard = input[i+1][j];
a = i+1;
b = j;
}
if((j+1) input[i][j+1]) {
min_ard = input[i][j+1];
a = i;
b = j+1;
}
//System.out.println("a = " + a + " b = " + b);
//System.out.println("input1[a][b]" + input1[a][b] + " input1[i][j] = " + input1[i][j]);
if(input1[a][b] == 0) {
if(input1[i][j] != 0) {
input1[a][b] = input1[i][j];
//System.out.println("assign...");
//replace(input1[a][b], input1[i][j]);
}
else {
input1[a][b] = input1[i][j] = ++val1;
//System.out.println("val1" + val1 + " i=" + i + " j = " + j + " a = " + a + " b = " + b);
}
}
else if(input[a][b] != input[i][j]) {
//System.out.println("input[i][j] = " + input1[i][j] + "input[a][b] = " + input1[a][b]);
int temp = input1[i][j];
input1[i][j] = input1[a][b];
if(input1[a][b] < temp) replace(temp, input1[a][b]);
else replace(input1[a][b],temp);
//System.out.println("replace");
}
else {
input1[i][j] = ++val1;
//System.out.println("");
}
}
static void replace(int a,int b) { //a is original value, to be replaced with b.
for(int i=0;i