假设有8支球队参加一个锦标赛,并且FairCycle方法被用来安排比赛。FairCycle方法的时钟模式将确保每支球队都能与其他球队公平地对抗一次。
首先,我们将8支球队编号为A、B、C、D、E、F、G、H。根据FairCycle方法,比赛的安排如下:
第一轮: A vs B C vs D E vs F G vs H
第二轮: A vs C B vs D E vs G F vs H
第三轮: A vs D B vs C E vs H F vs G
第四轮: A vs E B vs F C vs G D vs H
第五轮: A vs F B vs E C vs H D vs G
第六轮: A vs G B vs H C vs E D vs F
第七轮: A vs H B vs G C vs F D vs E
通过这个例子,我们可以看到每支球队都与其他球队公平地对抗了一次。FairCycle方法的时钟模式确保了每支球队都有相同的机会竞争,没有球队被遗漏或被偏好。这种安排方式确保了比赛的公平性,并且每支球队都有机会面对各种对手,增加了比赛的竞争性。
测试用例:
[code] 1 using NUnit.Framework; 2 using System; 3 using System.Linq; 4 using System.Collections.Generic; 5 6 namespace Solution { 7 8 [TestFixture] 9 public class SolutionTest10 {11 [Test]12 public void Test2Teams()13 {14 var expected = new []{ new []{(1, 2)} };15 16 var actual = Tournament.BuildMatchesTable(2);17 Assert.That(actual, Has.Length.EqualTo(1), "Should have 1 round");18 Assert.That(actual[0], Has.Length.EqualTo(1), "The round should have 1 match");19 if(actual[0][0].Item1>actual[0][0].Item2) (actual[0][0].Item1, actual[0][0].Item2) = (actual[0][0].Item2, actual[0][0].Item1);20 Assert.AreEqual(expected, actual, "The match should be team 1 vs team 2");21 }22 23 [Test]24 public void Test4Teams() => TestTeams(4);25 26 [Test]27 public void Test20Teams() => TestTeams(20);28 29 [Test]30 public void TestRandom()31 {32 Random rand = new Random();33 34 TestTeams(2*(3+rand.Next(3)));35 TestTeams(2*(6+rand.Next(4)));36 }37 38 public void TestTeams(int numberOfTeams)39 {40 List teamsExpected = Enumerable.Range(1, numberOfTeams).ToList();41 HashSet matchesExpected = new HashSet();42 foreach(var round in TournamentSolution.BuildMatchesTable(numberOfTeams))43 {44 foreach(var game in round) matchesExpected.Add(game.Item1>game.Item2?(game.Item2,game.Item1)game.Item1, game.Item2));45 }46 47 var actual = Tournament.BuildMatchesTable(numberOfTeams);48 Assert.That(actual, Has.Length.EqualTo(numberOfTeams-1), $"Should have {numberOfTeams-1} rounds");49 foreach(var round in actual)50 {51 List teamsByRound = new List();52 Assert.That(round, Has.Length.EqualTo(numberOfTeams/2), $"Each round should have {numberOfTeams/2} matches");53 foreach(var game in round)54 {55 Assert.That(game, Is.InstanceOf(typeof((int, int))), "Each match is a tupple of 2 teams");56 teamsByRound.Add(game.Item1);57 teamsByRound.Add(game.Item2);58 Assert.True(matchesExpected.Remove(game.Item1>game.Item2?(game.Item2,game.Item1)game.Item1, game.Item2)), $"{game} is a duplicate or doesn't exist");59 }60 teamsByRound.Sort();61 Assert.AreEqual(teamsExpected, teamsByRound, "Each round should have matches with every team");62 }63 Assert.IsEmpty(matchesExpected, "At least one match isn't scheduled");64 }65 }66 }67 68 public class TournamentSolution69 {70 public static (int, int)[][] BuildMatchesTable(int numberOfTeams)71 {72 List teams = Enumerable.Range(1, numberOfTeams).ToList();73 int roundsNbr = numberOfTeams-1, gamesNbr = numberOfTeams /2, rotatorID = roundsNbr-1, buffer = 0;74 (int, int)[][] result = new (int, int)[roundsNbr][];75 76 for (int i=0; i