int * init(int ac);
int check_match(int a1,int a2,int day);
int set_match(int a1,int a2,int day);
void list(void);
int build(int a_range,int u_sensitive);
int &unit(int althete,int day){return (tbl[althete * days + day]);}
};
int * althete_info::init(int ac)
{
a_count = ac;
days = ac - 1;
days |= 1;//天数总是单数,
delete [] tbl;
if(a_count > 0)
{
tbl = new int[(a_count + 1) * days];
if(tbl == NULL)
{
cout<<"Out of Memory !"<<endl;
exit(0);
}
// 对于填充 -1 ,单字节与整字没有区别
memset(tbl,-1,((a_count + 1) * days) * sizeof(int));
}
return(tbl);
}
int c_sensitive;//本区的敏感号
int ac_comp;//本区计算选手数,处理奇偶问题
int a_hrange;//半区选手数
int hr_resu;//上半区结果,调整下半区赛程
int h_days;//上半区比赛天数
int cr_resu;//本区结果,返回值
int ti,tj,tk;
int n;
int days;
int * match_tbl;
//安排场次
//比过 :1
//有比赛:-1
int set_match(int a1,int a2,int day)
{
int resu = check_match(a1,a2,day);
if(resu == 0)
{
match_tbl[a1 * days + day] = a2;
match_tbl[a2 * days + day] = a1;
}
return(resu);
}
//检查是否可以安排比赛
int check_match(int a1,int a2,int day)
{
//当天是否有比赛
if(match_tbl[a1 * days + day] >= 0 || match_tbl[a2 * days + day] >= 0)
return(-1);
//是否比过
for(int i = 0;i < days;i++)
{
if(match_tbl[a1 * days + i] == a2 || match_tbl[a1 * days + i] == a2)
return(1);
}
return(0);
}
void match(void)
{
int i,j;
int curr_day;
for(i = 0;i < n;i++)
{
curr_day = 0;
for(j = 0;j < n;j++)
{
switch(set_match(i,j,curr_day)){
case -1:
case 0:
curr_day++;
break;
}
}
}
void init_match(int athlete_count)
{
n = athlete_count;
days = n - 1;
days += n & 1;
match_tbl = new int[n * days];
for(int i = 0;i < n * days;i++)
match_tbl[i] = -1;
}