我有一个特定的团队数量。我希望每支球队在4个指定的时间与4个不同的对手进行4场比赛。
复杂之处在于,任何球队都不能同时进行两场不同的比赛。例如,如果1队像这样比赛
team1与team2、team1与team3、team1与team4、team1与team5
那么team2已经占用了第一个时隙,所以team2可以像这样玩
(team2 vs team1)、team2 vs team3、team2 vs team4、team2 vs team5
但这里出现了问题,team3将与team1和team2一起在第二个时隙播放,这是不可能做到的。
我不知道这个算法可以叫什么,但我正在寻找实现这个算法的算法。
我进行了一次搜索,寻找循环赛和其他比赛,比如匹配算法和婚姻问题,但我认为我的问题不同。如果我错了,请纠正我。
任何帮助都是非常感谢的。
发布于 2012-12-20 05:10:40
我的结论是,如果团队数量是奇数,就没有解决方案。设N是团队的数量。我们需要一个N*4/2
的比赛总数,每队四场比赛,但每场比赛计数为两支球队。要在四个时隙中进行N*2
匹配,我们必须平均每个时隙的N/2
匹配。我们一次最多只能进行floor(N/2)
匹配。如果N是奇数,则返回floor(N/2) < N/2
。
一个仅适用于偶数N的解决方案(如果存在)会有用吗?
发布于 2017-10-20 18:42:05
此算法适用于任何数量的团队。
假设一场锦标赛有6支球队。
这个解决方案基本上告诉您如何填充6x6矩阵,矩阵中的每个条目都是行与列中的球队之间的匹配。
在算法中考虑一些规则
矩阵中的
mat[0][0] = 1
i == j
,然后填充[n-1][j]
的矩阵,而不是[i][j]
的矩阵。基本上,在i==j
我们将遵循这条规则,从[0][0]
开始逐列填充矩阵。意味着我们将首先填充第0列的每一行,然后移动到第一列,依此类推。
[0][0]
,应用规则2。因此,填写mat[n-1][0] = 0
mat[1][0]
,填写下一个数字ie 2,类似地,填写[2][0], [3][0], [4][0]
H124,现在第1列,从值2开始
mat[1][0] = 2;
mat[1][1]
应用规则2,填充当前列的最后一行,即mat[n-1][1] = 3
F233
如果你希望每支球队只与其他球队进行一场比赛,那么可以使用下三角。
如果你想让每支球队和其他球队打两场比赛,一个主场和一个客场都使用下三角和上三角。
希望你们能理解我的解决方案。
干杯
发布于 2012-12-20 05:16:07
一个简单的算法:
Round 1
1 2 3 4
8 7 6 5
然后旋转2-8个位置...
Round 2
1 8 2 3
7 6 5 4
Round 3
1 7 8 2
6 5 4 3
http://en.wikipedia.org/wiki/Round-robin_tournament#Scheduling_algorithm
(如果有一个奇数,可以通过添加一个虚拟配对来扩展this,以表示再见,但正如Patricia Shanahan所指出的,并不是每个球队都会打每一轮比赛。因此,需要偶数个团队和至少六个团队才能满足要求。)
https://stackoverflow.com/questions/13964948
复制