Оптимальное распределение муравьёв по путям - sergeresko/Lem_in-explanation GitHub Wiki
Вот способ, который я придумал с самого начала. Он неэффективный, но правильный и даёт основную идею, которую потом можно усовершенствовать.
Пусть есть 7 муравьёв и, допустим, алгоритм Бхандари нашёл два пути разной длины:
( )----( )----( )
/ \
(7) ( )
\ /
( )-( )-( )-( )-( )
Слева start, справа end. В каждой комнате я буду отмечать, сколько в ней муравьёв.
Примем условно, что в start находится бесконечное число муравьёв.
Будем делать в цикле такие действия:
- всех муравьёв, которые не находятся в start или end, сдвинуть в следующую комнату по направлению к end,
- выпустить из start по одному муравью на каждый путь.
Когда какой-то муравей попадает в end, увеличиваем на единицу счётчик муравьёв, которые попали туда по соответствующему пути.
Вот, как будет выглядеть процесс:
(1)----( )----( ) count1: 0
/ \
(∞) ( )
\ /
(1)-( )-( )-( )-( ) count2: 0
(1)----(1)----( ) count1: 0
/ \
(∞) ( )
\ /
(1)-(1)-( )-( )-( ) count2: 0
(1)----(1)----(1) count1: 0
/ \
(∞) ( )
\ /
(1)-(1)-(1)-( )-( ) count2: 0
(1)----(1)----(1) count1: 1
/ \
(∞) (1)
\ /
(1)-(1)-(1)-(1)-( ) count2: 0
(1)----(1)----(1) count1: 2
/ \
(∞) (2)
\ /
(1)-(1)-(1)-(1)-(1) count2: 0
(1)----(1)----(1) count1: 3
/ \
(∞) (4)
\ /
(1)-(1)-(1)-(1)-(1) count2: 1
(1)----(1)----(1) count1: 4
/ \
(∞) (6)
\ /
(1)-(1)-(1)-(1)-(1) count2: 2
При передвижении очередного муравья по любому из путей, количество муравьёв в end станет равно 7, т.е. все дойдут до конца, при этом будет count1 = 5, count2 = 2
или count1 = 4, count2 = 3
.
Таким образом, все муравьи, которые ещё не пришли в end, оказались лишними, а count1
и count2
показывают, сколько муравьёв и куда в действительности нужно было отправить.
На основании этого нетрудно посчитать, сколько строчек решения это займёт.
Решение, которое от нас требуют выводить на экран, будет описывать как раз это движение муравьёв.
Дальше: Ссылки на алгоритм Бхандари