这个算法叫做蛇环算法。
即,把所有球队排成一个环形(2列),左边对阵右边,第一支队伍不动,其他队伍顺时针循环,这样就肯定不重复了。
为了方便说明,假设有8支球队a到h。像下面那样按环形排好。
这样,第1轮的对阵就是,(a,h)(b,g)(c,f)(d,e)。
下一轮的时候,第一支球队a不动,其它球队像齿轮一样顺时针走一格。
这样,第2轮的对阵就是,(a,b)(c,h)(d,g)(e,f)。
齿轮继续滑动,直到回到原点,这样每支球队都跟其它所有7支球队对阵了。
c++部分代码。
bool TeamSchedulType::init( WORD num )
{
if( !num )
return false;
if( num % 2 != 0 )
return false;
m_num = num;
schedule.resize( (num-1)*2 );
WORD half = num / 2;
std::vector<WORD> vec;
vec.resize( num );
// 先初始化
for( size_t i = 0; i < vec.size(); ++i )
{
vec[i] = i;
}
// 然后开始排
for( size_t i = 0; i < (vec.size()-1)*2; ++i )
{
WORD index = i % (vec.size()-1);
for( size_t j = 0; j < half; ++j )
{
WORD home_index = (i+j) % num;
WORD away_index = (i+num-j-1) % num;
schedule[i].push_back( std::make_pair( vec[home_index], vec[away_index] ) );
}
WORD next_index = (index+1)%num;
WORD temp = vec[index];
vec[index] = vec[next_index];
vec[next_index] = temp;
}
return true;
}