📄 382.htm
字号:
<!-- saved from url=(0022)http://internet.e-mail -->
<html>
<head>
<title>循环赛(日程安排) </title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="inc.css">
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#000000" vlink="195434" alink="195434">
<table width="621" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td width="621"><a href="http://www.CoDelphi.com"><img src="images/logo.gif" border="0" width="153" height="60"><img src="images/bigbanner.gif" border="0" width="468" height="60"></a></td>
</tr>
</table><br>
<br>
<table width="621" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td align="left" valign="top" class="font9" height="155">
<div align="center" class="btitle">循环赛(日程安排) <br>
<br>
</div>
<div align="center"><strong>Michael Gillson </strong></div>
<b><br>
摘 要</b>:如何建立任意大小的循环赛程安排? <br>
<b> 关键字</b>:动态数组 循环赛 <br>
<b> 类 别</b>:其它
<hr size="1" width="100%">
<span class="content"><br>通过使用Delphi动态数组,数组大小不是在设计时而是在运行时确定的。<br>此处是用于建立循环赛程安排的单元,<br><br>unit uSupport;<br><br>interface<br><br>const<br> BYE_GAME : Integer = -1;<br><br>type<br> TPair = Record<br> Home : Integer;<br> Away : Integer;<br> Round : Integer;<br> Desc : String;<br> End;<br> TPairings = Array of TPair;<br><br>procedure MakeSchedule (var Pairings : TPairings; iTeams : Integer);<br><br>implementation<br><br>procedure MakeSchedule (var Pairings : TPairings; iTeams : Integer);<br>var<br> bAddedBye : Boolean;<br> iGamesPerRound : Integer;<br> iRounds : Integer;<br> Teams : Array of Integer;<br> I,J : Integer;<br> iRound : Integer;<br> iTeam : Integer;<br> iGame : Integer;<br> iTotalGames : Integer;<br> iPair : Integer;<br> iLastTeam : Integer;<br> iSaveTeam : Integer;<br> Pair : TPair;<br>begin<br> {<br> 防止低级错误<br> }<br> If iTeams < 2 Then<br> Exit;<br> {<br>是否每次都有一场轮空?<br> }<br> If iTeams Mod 2 = 0 Then<br> bAddedBye := False<br> Else<br> Begin<br> bAddedBye := True;<br> iTeams := iTeams + 1;<br> End;<br> iRounds := iTeams - 1;<br> iGamesPerRound := iTeams Div 2;<br> {<br>确定比赛总场数<br> }<br> iTotalGames := iRounds * iGamesPerRound;<br> SetLength (Pairings,iTotalGames);<br> {<br>为除第一队外的所有队伍建立数组。<br> }<br> SetLength (Teams,iTeams - 1);<br> iTeam := 1;<br> iLastTeam := iTeams - 2;<br> For I := 0 To iLastTeam Do<br> Begin<br> iTeam := iTeam + 1;<br> If bAddedBye And (iTeam = iTeams) Then<br> Teams [I] := BYE_GAME<br> Else<br> Teams [I] := iTeam;<br> End;<br> {<br>按逆时针方向使队伍循环。第一队保持不变。下面的例子示范10支队伍的情形。<br> 1-10 1-9 1-8 1-7 1-6 1-5 1-4 1-3 1-2<br> 2-9 10-8 9-7 8-6 7-5 6-4 5-3 4-2 3-10<br> 3-8 2-7 10-6 9-5 8-4 7-3 6-2 5-10 4-9<br> 4-7 3-6 2-5 10-4 9-3 8-2 7-10 6-9 5-8<br> 5-6 4-5 3-4 2-3 10-2 9-10 8-9 7-8 6-7<br><br>处于第一位的是主队。因为第一队总是主队,所以我会交换那支队伍。我通常在表中把轮空当成是一支客队。<br> }<br> iPair := 0;<br> For iRound := 1 To iRounds Do<br> Begin<br> iTeam := 0;<br> For iGame := 1 To iGamesPerRound Do<br> Begin<br> With Pairings [iPair] Do<br> Begin<br> Round := iRound;<br> Desc := '';<br> If iTeam = 0 Then<br> {<br> 把第一队换成主场,强行使轮空当成是客队。<br> }<br> If (iRound Mod 2 = 0) And (Teams [iLastTeam] > 0) Then<br> Begin<br> Home := Teams [iLastTeam];<br> Away := 1;<br> End<br> Else<br> Begin<br> Home := 1;<br> Away := Teams [iLastTeam];<br> End<br> Else<br> {<br> 保证轮空是客队。<br> }<br> If Teams [iTeam - 1] > 0 Then<br> Begin<br> Home := Teams [iTeam - 1];<br> Away := Teams [iLastTeam - iTeam];<br> End<br> Else<br> Begin<br> Home := Teams [iLastTeam - iTeam];<br> Away := Teams [iTeam - 1];<br> End;<br> End;<br> iTeam := iTeam + 1;<br> iPair := iPair + 1;<br> End;<br> {<br> 使队伍循环<br> }<br> iSaveTeam := Teams [iLastTeam];<br> For I := iLastTeam DownTo 1 Do<br> Teams [I] := Teams [I - 1];<br> Teams [0] := iSaveTeam;<br> End;<br> {<br>用浮泡排序法把最低的主队放在前面。<br> }<br> For I := 0 To iTotalGames - 1 Do<br> For J := I + 1 To iTotalGames - 1 Do<br> If (Pairings [J].Round = Pairings [I].Round) And<br> (Pairings [J].Home < Pairings [I].Home) Then<br> Begin<br> Pair := Pairings [J];<br> Pairings [J] := Pairings [I];<br> Pairings [I] := Pair;<br> End;<br>end;<br><br>end.<br><br><br>这里给出打印循环赛程的简易方法。<br><br>procedure TfrmMain.btnMakeScheduleClick(Sender: TObject);<br>var<br> Pairings : TPairings;<br> I,J : Integer;<br> iRounds : Integer;<br>begin<br> RichEdit1.Clear;<br> iRounds := StrToIntDef (edtRounds.Text,2);<br> MakeSchedule (Pairings,iRounds);<br> J := 0;<br> For I := Low (Pairings) To High (Pairings) Do<br> Begin<br> {<br> 另一轮比赛<br> }<br> If Pairings [I].Round <> J Then<br> Begin<br> J := Pairings [I].Round;<br> RichEdit1.Lines.Add ('Round ' + IntToStr (J));<br> End;<br> If Pairings [I].Away < 1 Then<br> RichEdit1.Lines.Add (' Home : ' + IntToStr (Pairings [I].Home) + ' Away : BYE')<br> Else<br> RichEdit1.Lines.Add (' Home : ' + IntToStr (Pairings [I].Home) + ' Away : ' +<br> IntToStr (Pairings [I].Away));<br> End;<br>end;</span>
<table border="0" cellspacing="0" cellpadding="1" class="font9" align="center" width="100%">
<tr align="left" valign="middle" bgcolor="195434">
<td height="1"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="#C9C9C6" height="2"></td>
</tr>
</table>
<div align="center"><br>
中文开发在线<a href="http://www.codelphi.com" target="_blank">www.codelphi.com</a>授权使用。
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -