我试着把X个团队分成“游戏日”,每天由3个团队组成
对于15个团队来说,有不止一个解决方案可以解决这个问题。
找到9-21球队所有可能的赛程/比赛计划的最佳方法是什么?组数为11、14、17和20也会导致问题,因为total_matches/3=“必须是偶数/整数”
15 Teams // 105 Total Matches // 35 Total Days
D1 = 1:2 1:3 2:3
D2 = 2:4 2:5 4:5
D3 = 3:4 3:6 4:6
D4 = 4:1 4:7 1:7
D5 = 5:1 5:6 1:6
D6 = 6:2 6:7 2:7
7 = 7:3 7:5 3:5
8 = 8:1 8:9 1:9
9 = 9:2 9:10 2:10
10 = 10:1 10:11 1:11
11 = 11:2 11:8 2:8
12 = 12:1 12:13 1:13
13 = 13:2 13:14 2:14
14 = 14:1 14:15 1:15
15 = 2:12 2:15 12:15
16 = 3:8 3:10 8:10
17 = 3:9 3:11 9:11
18 = 3:12 3:14 12:14
19 = 4:8 4:12 8:12
20 = 5:8 5:13 8:13
21 = 6:8 6:14 8:14
22 = 7:8 7:15 8:15
23 = 9:4 9:13 4:13
24 = 9:5 9:12 5:12
25 = 10:4 10:14 4:14
26 = 11:4 11:15 4:15
27 = 12:6 12:10 6:10
28 = 13:3 13:15 3:15
29 = 14:5 14:11 5:11
30 = 5:10 5:15 10:15
D31 = 6:9 6:15 9:15
D32 = 6:11 6:13 11:13
D33 = 7:9 7:14 9:14
D34 = 7:10 7:13 10:13
D35 = 7:11 7:12 11:12
发布于 2019-03-20 02:42:29
团队的可能组合/匹配的数量可以在数学上描述为Triangular Number。
例如,当有9支球队时,比赛的数量是36场。
请注意,只有当k或k-1可被3整除时,这个数字才能被3整除。对于5个团队,您将最终得到10个可能的游戏。你的最后一周将只有一场比赛,或者你可以改变它的结构。
如果你想写出匹配的组合,你可以通过迭代两次团队的数量来列出它们。以下是一些示例Java代码。You may run it in an online Java compiler.
public class MyClass {
public static void main(String args[]) {
int TEAMS = 10; //Number of teams
int combos = 0;
for(int i = 1; i <= TEAMS-1; i++){
for(int j = i+1; j <= TEAMS; j++){
System.out.println("Team " + i + " plays Team " + j);
combos ++;
}
}
System.out.println("There is " + combos + " possible matches");
}
}
我们不只是想要两支球队的每一个组合。我们想看看3个团队的组合。从数学上讲,我们需要一个Combination。
我们可以将我们的三角数重写为n rewrite k。我们前面的例子变成了:
我们选择的每周有3支球队比赛。总的可能的日期组合是n选择3。在我们的例子中有9个团队。
我们有84种可能的日期组合。现在很多时候都有重叠的游戏。例如,如果我们让1,2和3队有一天比赛,那么我们不想再有1,2和4队的比赛,因为然后1和2互相比赛2场比赛。解决这个问题的办法可能是忽略重复的游戏。
我想指出,完美的解决方案是不存在的。对于大多数球队来说,没有一种解决方案可以让每天3支球队一起比赛,而这些球队还没有比赛过。例如,当我们有4支球队时,我们的游戏是: 1-2,1-3,1-4,2-3,2-4,3-4。如果我们在第一天拿到3支球队(1-2,1-3,2-3),那么第二天我们就得不到完美的组合(1-4,2-4,3-4)。
无论你如何打破它,你都可以排序出最好的组合,但最终你会得到许多随机的游戏。
我创建了下面的代码来查看每种可能的日期组合,并打印出不重复的日期。
public class MyClass {
public static void main(String args[]) {
int TEAMS = 9; //Number of teams
//Keep track of each game combination used
boolean gamesPlayed[][] = new boolean[TEAMS+1][TEAMS+1];
int day = 1;
for(int i = 1; i <= TEAMS-2; i++){
for(int j = i+1; j <= TEAMS-1; j++){
for(int k = TEAMS; k >= j+1; k--){
if(!gamesPlayed[i][j] && !gamesPlayed[i][k] && !gamesPlayed[j][k] )
{
System.out.println("Day "+ day++ + " Teams " + i + ", " + j + " & " + k + " Play");
gamesPlayed[i][j] = true;
gamesPlayed[i][k] = true;
gamesPlayed[j][k] = true;
}
}
}
}
System.out.println("\nLeftover games");
for(int i = 1; i <= TEAMS-1; i++){
for(int j = i+1; j <= TEAMS; j++){
if(! gamesPlayed[i][j])
System.out.println(" Team " + i + " plays Team " + j);
}
}
}
}
https://stackoverflow.com/questions/55236865
复制相似问题