我有一定数量的团队。我希望每支球队在4个特定时间与4个不同的对手进行4场比赛。
复杂的原因在于没有球队可以同时进行2场不同的比赛。
例如,如果球队1正在这样打球
team1 vs team2,team1 vs team3,team1 vs team4,team1 vs team5
然后team2已经占据了第一个时间段,所以team2可以像这样玩
(team2 vs team1),team2 vs team3,team2 vs team4,team2 vs team5
但是问题出现了,team3将在team1和team2的第二个时段播放,但这是无法完成的。
我不知道这个算法可以调用什么,但我正在寻找算法来实现它。
我搜索了搜索循环和其他比赛,如匹配算法和婚姻问题,但我认为我的问题是不同的。如果我错了,请纠正我。
非常感谢任何帮助。
答案 0 :(得分:3)
我已经得出结论,如果球队的数量是奇数,则没有解决方案。设N是团队的数量。我们需要总共N*4/2
场比赛,每队有四场比赛,但每场比赛都计入两队。要在四个时段中进行N*2
次匹配,我们必须对每个广告位进行N/2
次匹配。我们一次最多可以进行floor(N/2)
次匹配。如果N是奇数,floor(N/2) < N/2
。
仅适用于N的解决方案(如果存在)是否有用?
答案 1 :(得分:1)
此解决方案基本上告诉您如何填充6x6矩阵,矩阵中的每个条目都是行与列之间的匹配。
在算法中考虑一些规则
1.矩阵从左到右,从上到下递增值。 mat[0][0] = 1
2.每当i == j
时,请填写[n-1][j]
处的矩阵,而不是[i][j]
。基本上,i==j
上没有参赛作品
3.当矩阵中的条目达到6时,将其设为1
我们将遵循此规则并开始从列[0][0]
列填充矩阵。
首先我们将填充第0列的每一行,然后移动到第1列,所以
- 在[0][0]
,应用规则2.填写mat[n-1][0] = 0
- 在mat[1][0]
,填写下一个数字,即2,类似于[2][0], [3][0], [4][0]
- 现在第1列,从值2开始
- mat[1][0] = 2;
- 在mat[1][1]
应用规则2时,填写当前列的最后一行,即mat[n-1][1] = 3
如果你希望每支球队只与其他球队一起比赛,请使用较低的三角形。
如果你希望每支球队都能与其他球队一起打2场比赛,那么主场和客场都会使用低三角和高三角。
希望你们理解我的解决方案。
干杯
答案 2 :(得分:0)
一个简单的算法:
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
(如果有一个奇数,可以通过添加虚拟配对来表示再见,但是随后帕特里夏·沙纳汉指出,并非每个球队都会参加每一轮。所以偶数球队至少需要六个团队来满足要求。)