2012-09-19 5 views
0

이 작품은 나를 위해 작동하지만 전혀 작동하지 않습니다. 아무도 설명 할 수 있을까요?리그 비품 알고리즘 설명

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)); 
    } 
} 

모듈러스가있는 트릭은 무엇입니까?

+0

당신이 '% (teams_count-1)'대신'%의 teams_count'이어야 확신이 음수 제대로 랩 어라운드 무엇입니까? –

+0

나는 정말로 모른다. 방금이 코드를 웹 어딘가에서 발견했습니다. 그것은 나를 위해 잘 작동합니다. – micnyk

+0

마지막 팀이 첫 번째 경기에서 어웨이 팀이라는 특별한 경우를 제외하고는 마지막 팀이 경기의 일부가 될 수 없다는 식으로 보입니다. 어쩌면 이것이이 리그의 올바른 행동 일지 모르지만 약간 이상하게 보입니다. –

답변

4

teams_count 대신 teams_count-1을 사용해야하는 이유는 모르겠지만 일반적으로 모듈러스는 "랩 어라운드 (rarap around)"하여 round+match이 마지막 팀 번호보다 크면 다시 래핑합니다. 마지막 팀을 지나는 대신 첫 번째 팀 중 하나.

away 처리 방법은 조금 특별합니다. % 연산자는 음수 일 때 원하는 방식으로 줄 바꿈하지 않습니다. 예를 들어 -1 % 54 대신 -1을 제공합니다. 이 문제를 해결하기위한 트릭은 약수를 추가하는 것입니다. (-1+5)%5은 당신에게 4를 제공합니다.

코드를 좀 더 명확하게 재 작업 해 봅시다.

int n = teams_count-1; 
int home = (round + match) % n; 
int away = (n - match + round) % n; 

그런 다음 나는 away 계산 a를 재구성합니다 : 우선은 팀의 수를 (다시 내가 teams_count-1 코드에서이 사용되는 이유는 확실하지 않다) 표현하기 위해 다른 변수 n를 사용합니다 작은 :

int n = teams_count-1; 
int home = (round + match) % n; 
int away = (round - match + n) % n; 

는 이제 홈 팀이 현재 라운드 시작으로 원정 팀이 현재 라운드 시작하여 경기를 뺀 상태에서 다음 경기를 추가하는 것을 명확하게해야한다. % n는 랩 어라운드 만들고, away에 대한 + n