联盟夹具算法解释

时间:2012-09-19 16:21:35

标签: c++ algorithm

这适合我,但我不明白它是如何工作的。谁能解释一下?

for(int round = 0; round < rounds_count; round++)
{
    for(int match = 0; match < matches_per_round; match++)
    {
        int home = (round + match) % (teams_count - 1);
        int away = (teams_count - 1 - match + round) % (teams_count - 1);

        if(match == 0)
            away = teams_count - 1;

        matches.push_back(Match(&teams[home], &teams[away], round));
    }
}

模数的诀窍是什么?

1 个答案:

答案 0 :(得分:4)

我不确定为什么会使用teams_count-1代替teams_count,但一般来说,模数会使其“环绕”,以便round+match大于away最后一个球队的号码,它将回到第一支球队之一,而不是经过最后一支球队。

处理-1 % 5的方式有点特别。当您有负数时,%运算符不会以您想要的方式回绕。例如-1为您提供4而不是(-1+5)%5。解决这个问题的一个技巧是添加你的除数。 n给你4。

让我们重新编写代码以使其更清晰。首先,我将使用另一个变量int n = teams_count-1; int home = (round + match) % n; int away = (n - match + round) % n; 来表示团队数量(再次,我不确定为什么在您的代码中使用teams_count-1):

away

然后我会稍微重新组织int n = teams_count-1; int home = (round + match) % n; int away = (round - match + n) % n; 计算:

% n

现在应该更清楚的是主队从当前一轮开始然后添加比赛,而客场球队从当前一轮开始并减去比赛。 + n使其环绕,away {{1}}使其正确地包围负数