#include <stdio.h>

void neighbour(int sx, int sy);
void diagnolNeighbour(int sx, int sy);
void allNeighbour(int sx, int sy);
void display();

int array[4][4];
int row = 3;
int col = 3;
int startRow = 0;
int startCol = 0;

int main()
{
    int k = 0;
    int i = 0;
    int j = 0;
    
    for (i = 0; i <= row; i++) {
		for (j = 0; j <= col; j++) {
		    ++k;
		    array[i][j] = k;
		    if (k < 10) {
				printf("%d   ", array[i][j]);
		    } else {
				printf("%d  ", array[i][j]);
		    }
		}
		printf("\n");
    }
    printf("\n\n");

    for (i = 0; i <= row; i++) {
		for (j = 0; j <= col; j++) {
		    printf("\nNeighbour for (%d,%d) %d: ",i,j, array[i][j]);
		    neighbour(i,j);
		}
    }

    display();
    printf("Neighbour with Diagnols\n");
    for (i = 0; i <= row; i++) {
		for (j = 0; j <= col; j++) {
		    printf("\nNeighbour for (%d,%d) %d: ",i,j, array[i][j]);
		    diagnolNeighbour(i,j);
		}
    }

    display();
    printf("Neighbour with all Diagnols\n");
    for (i = 0; i <= row; i++) {
		for (j = 0; j <= col; j++) {
		    printf("\nNeighbour for (%d,%d) %d: ",i,j, array[i][j]);
		    allNeighbour(i,j);
		}
    }
    printf("\n");

    return 0;
}

void display()
{
    int k = 0;
    int i = 0;
    int j = 0;
    
    printf("\n\n");
    for (i = 0; i <= row; i++) {
		for (j = 0; j <= col; j++) {
		    ++k;
		    if (k < 10) {
				printf("%d   ", array[i][j]);
		    } else {
				printf("%d  ", array[i][j]);
		    }
		}
	printf("\n");
    }
}

/******************************************************
 * Function: neighbour(int sx, int sy)
 * This function returns the neighbour of sx, sy
 * For e.g.
 * 1 2 3
 * 4 5 6
 * 7 8 9
 *
 * Neighbour for 5 (1,1) = 4, 2, 6, 8
 * Neighbour for 1 (0,0) = 4, 2
 * ****************************************************/
void neighbour(int sx, int sy)
{
    if (sy - 1 >= startCol && sy - 1 <= col) {
		printf("\n[%d][%d]: %d ", sx, sy - 1, array[sx][sy - 1]);
    }

    if (sx - 1 >= startRow && sx - 1 <= row) {
		printf("\n[%d][%d]: %d ", sx - 1, sy, array[sx - 1][sy]);
    }

    if (sy + 1 >= startCol && sy + 1 <= col) {
		printf("\n[%d][%d]: %d ", sx, sy + 1, array[sx][sy + 1]);
    }

    if (sx + 1 >= startRow && sx + 1 <= row) {
		printf("\n[%d][%d]: %d ", sx + 1, sy,array[sx + 1][sy]);
    }
}

/******************************************************
 * Function: diagnolNeighbour(int sx, int sy)
 * This function returns the neighbour of sx, sy and
 * diagonal neighbours too.
 * For e.g.
 * 1 2 3
 * 4 5 6
 * 7 8 9
 *
 * Neighbour for 5 (1,1) = 4, 2, 6, 8, 1, 3, 7, 9
 * Neighbour for 1 (0,0) = 4, 2, 5
 * ****************************************************/
void diagnolNeighbour(int sx, int sy) {
    if (sy - 1 >= startCol && sy - 1 <= col) {
		printf("%d ", array[sx][sy - 1]);
    }

    if (sx - 1 >= startRow && sx - 1 <= row) {
		printf("%d ", array[sx - 1][sy]);

		//Diagnols
		if (sy - 1 >= startCol && sy - 1 <= col) {
		    printf("%d ", array[sx - 1][sy - 1]);
		}
		if (sy + 1 >= startCol && sy + 1 <= col) {
		    printf("%d ", array[sx - 1][sy + 1]);
		}
    }

    if (sy + 1 >= startCol && sy + 1 <= col) {
		printf("%d ", array[sx][sy + 1]);
    }

    if (sx + 1 >= startRow && sx + 1 <= row) {
		printf("%d ", array[sx + 1][sy]);

		//Diagnols
		if (sy - 1 >= startCol && sy - 1 <= col) {
		    printf("%d ", array[sx + 1][sy - 1]);
		}
		if (sy + 1 >= startCol && sy + 1 <= col) {
		    printf("%d ", array[sx + 1][sy + 1]);
		}
    }
}

/******************************************************
 * Function: allNeighbour(int sx, int sy)
 * This function returns all the neighbour of sx, sy and
 * all diagonal neighbours.
 * For e.g.
 * 1   2   3   4
 * 5   6   7   8
 * 9   10  11  12
 * 13  14  15  16
 *
 * Neighbour for 5  (1,0) = 1, 9, 13, 6, 7, 8, 10, 15
 * Neighbour for 11 (2,2) = 3, 7, 15, 9, 10, 12, 1, 6, 16
 * ****************************************************/
void allNeighbour(int sx, int sy)
{
    int done = 0;
    int tempX = sx;
    int tempY = sy;
    int i = 0;
    int j = 0;

    // Get all the elements in row
    for (i = 0; i <= row; i++) {
		if (array[i][sy] == array[sx][sy]) {
		    continue;
		}
		printf("%d ", array[i][sy]);
    }

    // Get all the elements in col
    for (j = 0; j <= col; j++) {
		if (array[sx][j] == array[sx][sy]) {
		    continue;
		}
		printf("%d ", array[sx][j]);
    }

    // Diagnols
    while (1) {
        tempX--; tempY--;
		if (tempX >= startRow  && tempY >= startCol) {
		    printf("%d ", array[tempX][tempY]);
		} else {
		    done = 1;
		}

		sx++,sy++;
		if (sx <= row && sy <= col) {
		    printf("%d ", array[sx][sy]);
		} else if (done) {
		    break;
		}
    }
}
