1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void leage(int n){
    int i,j,k;
    int mapsize;
    int *map;
    mapsize=(n-1)*(n-1)*sizeof(int);
    map=(int*)malloc(mapsize);
    memset(map,0,mapsize);
/*
表の割り当て
実際は半分の容量でよい
      j=   0 1 2 ..n-2
         1 2 3 4 ..n
 i=0  1 XX
   1  2 XXXX
   2  3 XXXXXX
   3  4 XXXXXXXX
   :  :
  n-1 n
*/
    for(i=0;i<n-1;i++){    //行方向のループ
        for(j=i;j<n-1;j++){//列方向のループ
            if(i==0){
            //1のチームはシンプルな組み合わせとし、
            //この部分はチームスケジュールフラグとする
                map[j]=1<<j;
            }else{
                //あいている日程の検索
                //とりあえず、上の欄の次にしてみる
                k=map[(i-1)*(n-1)+j];

                if((k*=2)&((1<<(n-1))-1)==0) k=1;    //左にビットローテーション

                
                while((map[j]|map[i-1])&k){    //両チームの予定が埋まってたら次の日程で
                    if((k*=2)&((1<<(n-1))-1)==0) k=1;    //左にビットローテーション
                }
                //日程の決定
                map[i*(n-1)+j]=k;
                //チームスケジュールの登録
                map[j]|=k;
            }
        }
    }
    //スケジュールの表示
    for(k=0;k<n-1;k++){    //日程のループ
        //1のチームはシンプルな組み合わせにする。
        printf("%d:1-%d ",k+1,k+2);
        //それ以外のチームの検索
        for(i=1;i<n-1;i++){    //行方向のループ
            for(j=i;j<n-1;j++){//列方向のループ
                if(map[i*(n-1)+j]==(1<<k))    //予定日だったら表示
                    printf("%d-%d ",i+1,j+2);
            }
        }
        printf("\n");
    }
    printf("\n");
    free(map);
}

int main(){
    
    leage(2);
    leage(4);
    leage(6);
    return 0;
}