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 }
时间: 2024-11-09 05:03:00