Как вариант, можно решить задачу: найти все квадраты с левым верхним углом в точке (x,y) и стороной k.
Для k = 1 тривиально посчитаем для всех точек.
Для k = n отвечаем опираясь на предыдущие результаты для k = n -1.
UPD: Это из предположения что квадраты заполненные интересны.
hasRect[x][y] = hasRect[x][y] && hasRect[x + 1][y] && hasRect[x][y + 1]&& hasRect[x + 1][y + 1]