一、问题描述: 设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
能给个详细的源代码吗 谢谢了
一、问题描述: 设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
能给个详细的源代码吗 谢谢了
转:https://www.xuebuyuan.com/961847.html
比赛日程安排算法
2013年10月01日 ⁄ 综合 ⁄ 共 1215字 ⁄ 字号 小 中 大 ⁄ 评论关闭
这几天看都一个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); } }
package SolutionTennis;
import java.util.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);
}
}
public static void main(String[] args) {
int n=9;
T sol = new T(n);
sol.print();
}
}