设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:
每个球队必须与其他n-1个球队各赛一次;
每个球队一天只能赛一次;
当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
  n=6的比赛日程表示例(把6个队从1到6进行编号):  n=5的比赛日程表示例(增加编号0,凡碰0者该天即轮空):
  (1)请根据以上要求分析问题,设计算法,并加以说明;
  (2)编程实现算法,并以n=10和n=15进行测试,输出结果;
(3)分析算法的时间复杂度。

解决方案 »

  1.   

    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)
      

  2.   

     
    1 23456 5   0
    2-13456 5   1
    3 12456 5   2
    4 12356 5   3
    5 12346 5   4
    6 12345 5   530 去掉其中相同的 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   530种    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  4  5  6  7  8  9  n-1 n
        1      2  1  3  4  5  6  7  8  9  n-1 n
        2      3  1  2  4  5  6  7  8  9  n-1 n
        3      4  1  2  3  5  6  7  8  9  n-1 n
        4      5  1  2  3  4  6  7  8  9  n-1 n
        5      6  1  2  3  4  5  7  8  9  n-1 n
        6      7  1  2  3  4  5  6  8  9  n-1 n
        7      n  1  2  3  4  5  6  7  8  9   n-1 a[0][0]=1  a[0][1]=2  a[0][2]=3  a[0][n-1]=n
     a[1][0]=2  a[1][1]=1  a[1][2]=3当 a[][]   行数=列数的时候 删除  行数和列数同时自增 
               a[x][y] 当x=y时 删除 a[0][0] 到a[x][y]的数据、 剩下的数组中 不为空的a[x][y]   
             列
               0  1  2  3  4  5  6  7  8  9   n-1行  0      0  2  3  4  5  6  7  8  9  n-1 n
        1      0  0  3  4  5  6  7  8  9  n-1 n
        2      0  0  0  4  5  6  7  8  9  n-1 n
        3      0  0  0  0  5  6  7  8  9  n-1 n
        4      0  0  0  0  0  6  7  8  9  n-1 n
        5      0  0  0  0  0  0  7  8  9  n-1 n
        6      0  0  0  0  0  0  0  8  9  n-1 n
        7      0  0  0  0  0  0  0  0  8  9   n-1 a[0][1] a[0][2] a[0][3]
    a[1][2] a[1][3] a[1][4]
    a[2][3] a[2][4] a[2][5]
    a[3][4] a[3][5] a[3][6]
    a[4][5] a[4][6] a[4][7]1-2 1-3 1-4
    2-3 2-4 2-5
    3-4 3-5 3-6
    4-5 4-6 4-7
    5-6 5-7 5-8
    ......
    每天的 随即组合中 x!=y 1-2  3-5 4-6  就是其中一组 
    1-3  2-4 5-6  也是一组个人想法 难免有错 权当给楼主提供一个思路