// El mismo flood fill de deep_fill.c, sin recursión: las celdas pendientes van en una pila propia.
// Uso: fill_stack N
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int row;
    int col;
} Cell;

// Pinta (row, col) y la apila, si está dentro y sin pintar. Cada celda se apila una sola vez,
// así que la pila nunca pasa de size * size celdas.
void push_if_free(char *cells, int size, Cell *stack, long long *top, int row, int col) {
    if (row >= 0 && row < size && col >= 0 && col < size && cells[row * size + col] == 0) {
        cells[row * size + col] = 1;
        stack[*top].row = row;
        stack[*top].col = col;
        (*top)++;
    }
}

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: fill_stack N, con N de 1 a 99999\n");
        return 1;
    }

    size_t total = (size_t) size * size;
    char *cells = calloc(total, 1);
    Cell *stack = malloc(total * sizeof(Cell));
    if (cells == NULL || stack == NULL) {
        printf("no hay memoria\n");
        free(cells);
        free(stack);
        return 1;
    }

    long long top = 0;
    long long max_top = 0;
    long long painted = 0;
    push_if_free(cells, size, stack, &top, 0, 0);
    while (top > 0) {
        if (top > max_top) {
            max_top = top;
        }
        top--;
        Cell cell = stack[top];
        painted++;
        push_if_free(cells, size, stack, &top, cell.row - 1, cell.col);
        push_if_free(cells, size, stack, &top, cell.row + 1, cell.col);
        push_if_free(cells, size, stack, &top, cell.row, cell.col - 1);
        push_if_free(cells, size, stack, &top, cell.row, cell.col + 1);
    }

    printf("N = %d: %lld celdas pintadas, %lld pendientes como máximo\n", size, painted, max_top);
    free(cells);
    free(stack);
    return 0;
}
