2011-03-14 5 views
2

팀 (2vs2)에서 플레이하는 소규모 카드 토너먼트의 경우 누가 누구와 대결할지 "계획"을 세워야합니다.알고리즘을 검색하여 "일치"를 찾습니다

"규칙"은 다음과 같습니다

  • 우리는 팀의 수, 각 플레이어의 쌍으로 구성된이있다.
  • 토너먼트에는 여러 라운드가 있습니다.
  • 라운드 수는 팀 수보다 적습니다.

목표는 팀이 다른 팀과 두 번 경기하지 않을 계획을 세우는 것입니다.

나는 뒤로 추적하면서 "무거운"방법을 시도했지만, 생각한 것처럼 복잡성은 커졌고 빠르게 계산할 수있는 많은 가능성이 있었기 때문에 계획을 세울 수있는 알고리즘을 찾고있다. 빨리. 여기

내가 출력 원하는의 예입니다, 그것은 내 "무거운 방식"으로 생성 된 : 당신은 단지 몇 미리 정해진 라운드를 원하는 경우에

Tournament with 16 teams and 10 rounds 

Round 0 
Team 0 versus Team 1 
Team 2 versus Team 3 
Team 4 versus Team 5 
Team 6 versus Team 7 
Team 8 versus Team 9 
Team 10 versus Team 11 
Team 12 versus Team 13 
Team 14 versus Team 15 

Round 1 
Team 0 versus Team 2 
Team 1 versus Team 3 
Team 4 versus Team 6 
Team 5 versus Team 7 
Team 8 versus Team 10 
Team 9 versus Team 11 
Team 12 versus Team 14 
Team 13 versus Team 15 

Round 2 
Team 0 versus Team 3 
Team 1 versus Team 2 
Team 4 versus Team 7 
Team 5 versus Team 6 
Team 8 versus Team 11 
Team 9 versus Team 10 
Team 12 versus Team 15 
Team 13 versus Team 14 

Round 3 
Team 0 versus Team 4 
Team 1 versus Team 5 
Team 2 versus Team 6 
Team 3 versus Team 7 
Team 8 versus Team 12 
Team 9 versus Team 13 
Team 10 versus Team 14 
Team 11 versus Team 15 

Round 4 
Team 0 versus Team 5 
Team 1 versus Team 4 
Team 2 versus Team 7 
Team 3 versus Team 6 
Team 8 versus Team 13 
Team 9 versus Team 12 
Team 10 versus Team 15 
Team 11 versus Team 14 

Round 5 
Team 0 versus Team 6 
Team 1 versus Team 7 
Team 2 versus Team 4 
Team 3 versus Team 5 
Team 8 versus Team 14 
Team 9 versus Team 15 
Team 10 versus Team 12 
Team 11 versus Team 13 

Round 6 
Team 0 versus Team 7 
Team 1 versus Team 6 
Team 2 versus Team 5 
Team 3 versus Team 4 
Team 8 versus Team 15 
Team 9 versus Team 14 
Team 10 versus Team 13 
Team 11 versus Team 12 

Round 7 
Team 0 versus Team 8 
Team 1 versus Team 9 
Team 2 versus Team 10 
Team 3 versus Team 11 
Team 4 versus Team 12 
Team 5 versus Team 13 
Team 6 versus Team 14 
Team 7 versus Team 15 

Round 8 
Team 0 versus Team 9 
Team 1 versus Team 8 
Team 2 versus Team 11 
Team 3 versus Team 10 
Team 4 versus Team 13 
Team 5 versus Team 12 
Team 6 versus Team 15 
Team 7 versus Team 14 

Round 9 
Team 0 versus Team 10 
Team 1 versus Team 11 
Team 2 versus Team 8 
Team 3 versus Team 9 
Team 4 versus Team 14 
Team 5 versus Team 15 
Team 6 versus Team 12 
Team 7 versus Team 13 
+5

n-1 경기 (n은 팀 수임)를 할 수 없으면 항상 스위스 시스템을 제안합니다. http://en.wikipedia.org/wiki/Swiss-system_tournament – xanatos

답변

3

, 무작위로 참가자 씨앗, 다음 적용 라운드 로빈. 이 작업을 수행하는 가장 쉬운 방법은이 같은 팀 심볼을 배치하는 것입니다

A B C D 
E F G H 

그래서, 첫 라운드에서 짝이 A 있습니다 - E, B-F, 등등 그런 A를 고정하고,을 다른 모든 것들은 시계 방향으로 한 군데 회전합니다 :

A E B C 
F G H D 

반복하십시오.

라운드 수가 n-1 미만인 경우 스위스 시스템을 제안합니다. 페어링을 손으로 할 수도 있지만, 거기에는 이미 많은 페어링 프로그램이 있습니다. 일부는 경험적 방법을 사용하고, 일부는 Edmond의 "blossom"최소 중량 완전 일치 알고리즘의 변형입니다.

+0

이것은 완벽하게 보입니다. 오늘 저녁에 이것을 시험해 보겠습니다! – J4N

+0

그것은 매력처럼 작동했습니다! 고마워요! – J4N

0

선택 정렬 알고리즘을 적용하여 순열을 생성 할 수 있습니다. 나는 오랫동안 이런 일을했다. this article의 "쌍으로 된 순열"절을 참조하십시오.

코드는 파스칼이지만 C#으로 변환하기 쉽습니다.

관련 문제