У нас есть n столов, за которыми помещаются n игроков одновременно.
Необходимо создать формулу рассадки n*n игроков за n столами на максимальное количество раундов так, в конечном итоге каждый игрок сыграет с другим игроком не больше одного раза.
Я пробовал расписывать на бумажке, получалось примерно следующее.
Для
123 456 789
159 483 726
168 429 735
147 258 369
Так же сформировал для
1234 vbcd абвг 6789
17вd v28г аb39 6бc4
1б8b v4в9 а2с7 63гd
1v6a 2бd9 3cв8 4bг7
1сг9 2bв6 3vб7 4da8
Но я не могу вывести общую формулу, мне необходима такая рассадка для 10 игроков для 10 столов. Интуитивно кажется, что, согласно условиям, рассадку можно сформировать для 11 игр, но я не знаю, как правильно подходить к решению этой задачи.
Мои мысли и попытки решения:
1)Думал о том, что мы каждого игркоа на новый раунд сдвигаем на какое-то количество мест. И нам необходимо, чтобы ни одна пара игроков не играла дважды, поэтому можно создать что-то вроде маски сдвигов по примеру[0, 1, 2 ,3], которую применять к игрокам каждого стола, и формировать эту маску на каждый раунд так, чтобы суммарный сдвиг(маршрут) игроков, которые выходят из одной точки, не равнялся, потому что они тогда "сойдутся" за одним столом. Но этого недостаточно, в рассадке на троих возможна комбинация 147 258 369, сформированная путём группировки игроков по "разрядам", а не сдвигом. Получается, игрок перемещается не только по столам, но и по "разрядам", то есть маску надо формировать двумерную, и в этот момент это стало слишком сложно для меня, к тому же вполне вероятно, что это тупиковый вариант.
2) Пробовал написать программу, которая формирует такие столы тупым перебором, но у меня проблема с алгоритмом. В случае нужны, код программы на С++ могу предоставить.
Я писал так: каждый раунд мы выбираем из оставшегося пула игроков того, кто ещё не "знаком" ни с кем из игроков, уже набранных для данного стола, когда укомплектовали - идём к следующему. Столкнулся с тем, что уже на 3 раунде для случая n=3 можно начать укомплектовывать первые два стола так, что на третьем столе "пасьянс" уже не сойдётся, так как все оставшиеся игроки будут друг с другом знакомы. А на этапе формирования первого стола у нас недостаточно информации для того чтобы заглянуть в "остаток" для третьего стола. Возможно нужно формировать что-то вроде дерева решений, формировать список игроков подходящих для первого стола, и "смотреть", что будет если взять каждого конкретного игрока из списка, но это становится уже сложнее, и я тут решил попросить помощи у вас. Так же в голове крутится мысль попробовать использовать Prolog, так как все эти возвраты и проверки логических правил в духе языка, правда моё знакомство с прологом весьма шапочное, интересно послушать ваш совет.
Вполне возможно, эта задача решается по щелчку пальцев, я просто туповат.