日期:2014-05-19  浏览次数:20959 次

看下这个题的思路。
设有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