首页 > 代码库 > 循环赛日程表(Java实现)

循环赛日程表(Java实现)

 1 /**
 2  * 循环赛日程表:有n = 2^k个运动员要进行网球循环赛
 3  * 赛程表满足:
 4  * 每个选手必须与其他n-1个选手各赛一次
 5  * 每个选手一天只能参赛一次
 6  * 循环赛在n-1天内结束
 7  * 
 8  * 解题思路:
 9  * 将比赛日程表设计成一个n行和n-1列的表,第i行,第j列分别填入第i个选手在第j天所遇到的选手
10  * 栗子:
11  * 4个选手
12  * ---------
13  * |1|2|3|4|
14  * ---------
15  * |2|1|4|3|
16  * ---------
17  * |3|4|1|2|
18  * ---------
19  * |4|3|2|1|
20  * ---------
21  * 分治思想:将所有区域看成四块,区域1:(0,i) 区域2:(0,r+i) 区域3:(r,i) 区域4:(r,r+i)
22  *  递归执行的是区域1拷贝到区域4,区域2拷贝到区域3
23  * ---------
24  * | 1 | 2 |
25  * ---------
26  * | 3 | 4 |
27  * ---------
28  *  * @author 焦含寒
29  *
30  */
31 public class Roundrobin {
32     public static int[][] table(int k){
33         int n = 1<<k;
34         int[][] a = new int[n][n];
35         //构造赛程表第一行数据
36         for(int i = 0; i<n;i++)
37             a[0][i] = i+1;
38         //采用分治算法,构造整个赛程表
39         for(int r = 1;r<n;r<<=1){
40             for(int i =0;i<n;i += 2*r){
41                 copy(a,r,r+i,0,i,r);
42                 copy(a,r,i,0,r+i,r);
43             }
44         }
45         return a;
46     }
47     
48     private static void copy(int[][] a, int tox, int toy, 
49             int fromx, int fromy, int r){
50         for(int i =0;i<r;i++){
51             for(int j = 0;j<r;j++){
52                 a[tox+i][toy+j] = a[fromx+i][fromy+j];
53             }
54         }
55         
56     }
57         
58     
59     
60     public static void main(String[] args) {
61 
62         int[][] a = table(4);
63         for(int i=0;i<a.length;i++){
64             for(int j = 0;j<a[0].length;j++){
65                 System.out.print(a[i][j] + "ss ");
66             }
67             System.out.println();
68         }
69 
70     }
71 
72 }

 

循环赛日程表(Java实现)