创建一个程序,分配团队没有重复?

时间:2015-04-06 18:13:54

标签: java arrays arraylist shuffle

我希望创建一个程序,让six个团队每隔three天分配一次。但我也希望每个团队每天都参加two场比赛。我不希望他们在three天的同一时间内两次扮演同一个人。

我需要将每个游戏按two分组并随机化。一次会有两场比赛。

这是所需的输出:

Day 1:             Day 2:             Day 3:

 Team 1 -> Team 6 | Team 1 -> Team 4 | Team 1 -> Team 2
 Team 2 -> Team 5 | Team 2 -> Team 3 | Team 3 -> Team 4
 ________________ | ________________ | ________________
                  |                  |
 Team 3 -> Team 1 | Team 3 -> Team 6 | Team 5 -> Team 6
 Team 4 -> Team 2 | Team 4 -> Team 5 |
 ________________ | ________________ |
                  |                  |
 Team 5 -> Team 4 | Team 5 -> Team 1 |
 Team 6 -> Team 3 | Team 6 -> Team 2 |

它不需要像这样格式化,但这只是一个普遍的想法。

首先,我想让它循环三次,但我想确保它没有分配一个数字,如果这个数字已经在这个循环序列中使用过。

我相信代码会是这样的:

Integer[] teams = new Integer[6];

  for (int i = 0; i < 6; i++) {
     teams[i] = i + 1;
  }

  for (int i = 0; i < 3; i++) {
     Collections.shuffle(Arrays.asList(teams)); 

     System.out.printf("Team 1 -> %s%n", teams[0]);
     System.out.printf("Team 2 -> %s%n", teams[1]);
     System.out.printf("Team 3 -> %s%n", teams[2]);
     System.out.printf("Team 4 -> %s%n", teams[3]);
     System.out.printf("Team 5 -> %s%n", teams[4]);
     System.out.printf("Team 6 -> %s%n", teams[teams.length - 1]);

     System.out.println("____________");
     System.out.println();
     System.out.println();
  }

这是我使用此代码获得的输出。

Day 1
Team 1 -> 6
Team 2 -> 2
Team 3 -> 1
Team 4 -> 5
Team 5 -> 4
Team 6 -> 3
____________


Day 2
Team 1 -> 2
Team 2 -> 4
Team 3 -> 1
Team 4 -> 5
Team 5 -> 3
Team 6 -> 6

问题是:

- 如果将数字3分配给团队5,则不应将数字5分配给数字3。

- 无法将1号分配给第1组。

- 如果第4组在第1天被分配了5号,则不应在第2天或第3天为其分配相同的号码。

- 团队列表需要随机化并按两个分组。

我不太确定如何解决这些问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用两个循环。一个在另一个里面。循环以形成这种形状的三角形:

enter image description here

你只需要白色三角形。每个细胞都是游戏。白色三角形是每个可以玩的独特游戏。记住不要包括对角线,否则一支球队将会对抗自己。有6支球队,你应该得到15个可以玩的独特游戏。更一般地说:g = n(n-1)/ 2

编写一个游戏类,该游戏类需要两个团队并为每个单元格创建一个。对该列表进行排序,您可以尽可能唯一地进行播放。

答案 1 :(得分:1)

以下是一些可能的组合。如果您不希望每次分配都是随机的或不同的,您可以随时使用最后一个示例。否则,我认为如果您创建6个数组,然后一次填充一列,那么您将获得它。如果没有更多有效的分配可用,我有时必须返回并更改同一列中的先前分配,因此您的算法也可能需要这样做。如果这没有任何意义,那么我建议您自己编写更多团队作业组合,以获得更直观的问题感。

1 >> 2, 3, 4, 5, 6
2 >> 1, 4, 5, 6, 3
3 >> 5, 1, 6, 4, 2
4 >> 6, 2, 1, 3, 5
5 >> 3, 6, 2, 1, 4
6 >> 4, 5, 3, 2, 1

1 >> 2, 3, 4, 5, 6
2 >> 1, 5, 6, 4, 3
3 >> 4, 1, 5, 6, 2
4 >> 3, 6, 1, 2, 5
5 >> 6, 2, 3, 1, 4
6 >> 5, 4, 2, 3, 1

1 >> 6, 5, 4, 3, 2
2 >> 1, 6, 5, 4, 3
3 >> 2, 1, 6, 5, 4
4 >> 3, 2, 1, 6, 5
5 >> 4, 3, 2, 1, 6
6 >> 5, 4, 3, 2, 1