// Arup Guha
// 12/5/2023
// Solution to Q1 of COP 3502 Section 4 Part B Exam

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int** levelsquare(int n);
void freegrid(int** grid, int size);
void print(int** grid, int size);

// Bad hard-coded test!
int main() {
    int** g = levelsquare(5);
    print(g, 11);
    freegrid(g, 11);
    return 0;
}

int** levelsquare(int n) {

    // Allocate row pointers
    int** grid = calloc(2*n+1, sizeof(int*));

    // Make room for each row itself.
    for (int i=0; i<2*n+1; i++)
        grid[i] = calloc(2*n+1, sizeof(int));

    // Loop through the whole space.
    for (int i=0; i<2*n+1; i++) {
        for (int j=0; j<2*n+1; j++) {

            // Figure out how far from center you are.
            int left = abs(i-n);
            int right = abs(j-n);

            // We go with the larger number...
            grid[i][j] = left > right ? left : right;
        }
    }

    return grid;
}

// Free memory
void freegrid(int** grid, int size) {
    for (int i=0; i<size; i++) free(grid[i]);
    free(grid);
}

// For checking, prints the grid must be size by size.
void print(int** grid, int size) {
    for (int i=0; i<size; i++) {
        for (int j=0; j<size; j++)
            printf("%d ", grid[i][j]);
        printf("\n");
    }
}
