Как мне кажется, можно попробовать следующее. Когда три круга с радиусами
a,
b,
c касаются, их радиусы образуют треугольник со сторонами
a+b,
b+c и
с+a. (Радиусы касающихся кругов лежат на одной прямой, отсюда один шаг до треугольника.)
Зная стороны треугольника, можем вычислить его углы. Вычислим для начала угол в центре
a. Возьмем следующий круг
d и приставим его к
a и
c. Образуется еще один треугольник из кругов
a,
c и
d. Мы опять-таки можем вычислить его угол. Очевидно, мы можем таким образом укладывать круги вокруг a до тех пор, пока сумма внутренних углов не превысит 360 градусов.
После этого мы можем начать укладывать оставшиеся круги вокруг
b. У него к этому времени уже будет занята часть круга — кругами
a,
c и, возможно, последним кругом, уложенным с другой стороны
a.
Зная стороны и углы мы знаем центр круга и, таким образом, его вертикальные и горизонтальные границы. В процессе укладки можно отслеживать максимальную границу, чтобы ненароком не выйти за размер прямоугольника.
Возможно, в процессе работы будет имеет смысл добавлять воображаемые круги-заполнители.
Это не полное решение (алгоритма, кроме перебора, я не предложу, кроме того, возможны варианты, когда в промежуток между тремя касающимися кругами можно всунуть еще маленький кружок, так что алгоритм, возможно, будет довольно сложным). Но начало, кажется, хорошее.