看下这个题的思路。
设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:
每个球队必须与其他n-1个球队各赛一次;
每个球队一天只能赛一次;
当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
n=6的比赛日程表示例(把6个队从1到6进行编号):
n=5的比赛日程表示例(增加编号0,凡碰0者该天即轮空):
(1)请根据以上要求分析问题,设计算法,并加以说明;
(2)编程实现算法,并以n=10和n=15进行测试,输出结果;
(3)分析算法的时间复杂度。
------最佳解决方案--------------------public class SaiCheng {
private int[] dw = null;
public void init(int n){
//是否是偶数队
boolean isOdd = true;
//初始化数据
if (n % 2 != 0) {
isOdd = false;
dw = new int[n + 1];
} else {
dw = new int[n];
}
int len = dw.length;
if (isOdd) {
for (int i = 0; i < len; i++) {
dw[i] = i + 1;
//System.out.println(dw[i]);
}
} else {
for (int i = 0; i < len; i++) {
dw[i] = i;
//System.out.println(dw[i]);
}
}
}
public void printSc()
{
int len = dw.length;
//逆时针轮换
for(int i = 0; i < len -1; i++){
System.out.println("第"+(i+1)+"天");
for(int j= 0 ;j< len/2;j++)
{
System.out.println(dw[j] + "--" + dw[len - 1 - j]);
}
//把数组元素从第三位开始往后移,第二位设成最后一个值
int last = dw[len -1];
for(int k=len-1;k>1;k--)
{
dw[k]= dw[k-1];
}
dw[1] = last;
}
}
public static void main(String[] args) {
SaiCheng sc = new SaiCheng();
sc.init(10);
sc.printSc();
}
}
O(n^2)
------其他解决方案--------------------
1 23456 5 0
2-13456 5 1
3 12456 5 2
4 12356 5 3
5 12346 5 4
6 12345 5 5
30 去掉其中相同的 5+4+3+2+1 种 15种不同的 每天的比赛 随即取15个中的3个
当为奇数是
0 12345 0
1 02345 1
2 01345 2
3 01245 3
4 01235 4
5 01234 5
30种 15种 如上 每天去三个随即组合
n 为偶数
1 2--n-1 0
2 13--n-1 1
3 124--n-1 2
4 1234--n-1 3
5 12346--n-1 4
n 123456--n-1 n-1
总共sum=n*(n-1) 重复的z=1+2+3+4+...(n-1) 个 每天随机取 (sum-z)/(n-1) 个
定义一个二位数组a[n-1][n-1]
列
0 1 2 3 4 5 6 7 8 9 n-1
行 0 1 2 3