这几天看都一个ITAT比赛的一道题 题目是这样的
1、 设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:
a) 每个球队必须与其他n-1个球队各赛一次;
b) 每个球队一天只能赛一次;
c) 当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
n=6的比赛日程表示例(把6个队从1到6进行编号):
n=6的比赛日程表
第一天 |
第二天 |
第三天 |
第四天 |
第五天 |
1~2 |
1~3 |
1~4 |
1~5 |
1~6 |
3~5 |
2~4 |
2~5 |
2~6 |
2~3 |
4~6 |
5~6 |
3~6 |
3~4 |
4~5 |
n=5的比赛日程表示例(增加编号0,凡碰0者该天即轮空):
n=5的比赛日程表
第一天 |
第二天 |
第三天 |
第四天 |
第五天 |
1~0 |
1~5 |
1~4 |
1~3 |
1~2 |
2~5 |
0~4 |
5~3 |
4~2 |
3~0 |
3~4 |
2~3 |
0~2 |
5~0 |
4~5 |
想了好久也看了很多参考资料 什么分治算法 。(看的不是很明白)
后来在贴吧上看的有人跟了个很棒的思路!
------------------------------------------------------------------------------------------------
以6队为例,用数字表示,排成一个环形。
1号队不动,每一轮,逆时针转动,让各队从1号头上依次跳过,每移位一次得出的对阵就是本轮对阵。
无论有多少个队结果都是符合要求的
具体实现时用一个数组来处理就好了
---
1 4
2 5
3 6
---
1 5
4 6
2 3
---
1 6
5 3
4 2
---
1 3
6 2
5 4
----
1 2
3 4
6 5
----------------------------------------------
由 ahyyxx222提供
确实简单不少
我用了一个LinkedList实现
public class T{ private int num; // 队伍数 private LinkedList<Integer> list = new LinkedList<Integer>(); public T(int n) { this.num = n; init(); } private void init() { if (num % 2 == 0) //偶数个队伍 { for (int i = 0; i < num; i++) { list.add(i + 1); } } else //奇数个队伍 { for (int i = 0; i < num; i++) { list.add(i + 1); } list.add(0); } } public void print() { for (int i = 0; i < list.size() - 1; i++) { System.out.println("第" + (i + 1) + "天"); for (int j = 0; j < list.size() / 2; j++) { System.out.println(list.get(j) + "--" + list.get(list.size() - 1 - j)); } int temp = list.pollLast(); //移动 list.add(1, temp); } }