// team: 比赛安排结构,team[2k] vs team[2k+1]
// len: team的总数
// id: 第id轮的安排,id的范围[1, len-1]
voidgame(int*team,intlen,intid){
intbase= 2;
while(id > len/base){
id -= len/base;
base<<= 1;
}
for(inti=0; i
intstart = i+base/2+(id-1)*base;
for(intj=0; j
team[i*2*len/base+2*j] =base*j+i;
team[i*2*len/base+2*j+1] = (start+base*j)%len;
}
}
}
// 以下是測试部分
voiddump(int*arr,intlen){
for(inti=0; i
printf("%02d-%02d ", arr[i], arr[i+1]);
printf("/n");
}
intmain(){
constintlen = 16;
intteam[len];
for(inti=1; i
game(team, len, i);
printf("[%02d] ", i);
dump(team, len);
}
return0;
}
输出结果:
[01] 00-01 02-03 04-05 06-07 08-09 10-11 12-13 14-15
[02] 00-03 02-05 04-07 06-09 08-11 10-13 12-15 14-01
[03] 00-05 02-07 04-09 06-11 08-13 10-15 12-01 14-03
[04] 00-07 02-09 04-11 06-13 08-15 10-01 12-03 14-05
[05] 00-09 02-11 04-13 06-15 08-01 10-03 12-05 14-07
[06] 00-11 02-13 04-15 06-01 08-03 10-05 12-07 14-09
[07] 00-13 02-15 04-01 06-03 08-05 10-07 12-09 14-11
[08] 00-15 02-01 04-03 06-05 08-07 10-09 12-11 14-13
[09] 00-02 04-06 08-10 12-14 01-03 05-07 09-11 13-15
[10] 00-06 04-10 08-14 12-02 01-07 05-11 09-15 13-03
[11] 00-10 04-14 08-02 12-06 01-11 05-15 09-03 13-07
[12] 00-14 04-02 08-06 12-10 01-15 05-03 09-07 13-11
[13] 00-04 08-12 01-05 09-13 02-06 10-14 03-07 11-15
[14] 00-12 08-04 01-13 09-05 02-14 10-06 03-15 11-07
[15] 00-08 01-09 02-10 03-11 04-12 05-13 06-14 07-15