// Flood fill recursivo sobre una cuadrícula de N x N vacía: mide cuántos marcos se apilan.
// Uso: deep_fill N
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int size;
    char *cells;
    long long painted;
    long long depth;
    long long max_depth;
} Canvas;

void fill(Canvas *canvas, int row, int col) {
    canvas->depth++;
    if (canvas->depth > canvas->max_depth) {
        canvas->max_depth = canvas->depth;
    }
    int size = canvas->size;
    if (row >= 0 && row < size && col >= 0 && col < size && canvas->cells[row * size + col] == 0) {
        canvas->cells[row * size + col] = 1;
        canvas->painted++;
        fill(canvas, row - 1, col);
        fill(canvas, row + 1, col);
        fill(canvas, row, col - 1);
        fill(canvas, row, col + 1);
    }
    canvas->depth--;
}

int main(int argc, char *argv[]) {
    int size = 0;
    char extra = 0;
    if (argc != 2 || sscanf(argv[1], "%5d%c", &size, &extra) != 1 || size < 1) {
        printf("uso: deep_fill N, con N de 1 a 99999\n");
        return 1;
    }

    Canvas canvas = {size, calloc((size_t) size * size, 1), 0, 0, 0};
    if (canvas.cells == NULL) {
        printf("no hay memoria\n");
        return 1;
    }

    fill(&canvas, 0, 0);
    printf("N = %d: %lld celdas pintadas, %lld marcos apilados como máximo\n",
           size, canvas.painted, canvas.max_depth);
    free(canvas.cells);
    return 0;
}
