Можно написать динамический алгоритм.
Для каждой ячейки будем хранить:
left[x][y] - количество пробелов подряд слева от текущей ячейки
up[x][y] - количество пробелов подряд сверху от текущей ячейки
square[x][y] - размер квадрата из пробелов с правым нижним углом в текущей ячейке
Тогда:
left[x][y] = isspace(a[x][y]) ? left[x][y - 1] + 1 : 0
up[x][y] = isspace(a[x][y]) ? left[x - 1][y] + 1 : 0
square[x][y] = min(left[x][y] + 1, left[x][y] + 1, square[x - 1][y - 1] + 1)
Таким образом можно заполнить весь квадрат двигаясь по строкам слева направа, сверху вниз.