こう。 #5697(2008/02/07 03:04 GMT) [ C ] Rating0/0=0.00
あえて参考資料を見ないで作ってみました。 ビットでフラグ立ててるので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; }
Rating0/0=0.00-0+
[ reply ]
こう。 #5697() [ C ] Rating0/0=0.00
Rating0/0=0.00-0+
[ reply ]