総当たり戦の日程作成
Posted feedbacks - C
あえて参考資料を見ないで作ってみました。 ビットでフラグ立ててるので16か32組まで対応しているはず。
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;
}
|

ryugate
#5661()
Rating2/2=1.00
see: カークマンの組分け
[ reply ]