循環賽日程表(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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM