⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 382.htm

📁 好书啊!很好哦
💻 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>&nbsp;&nbsp;BYE_GAME   : Integer = -1;<br><br>type<br>&nbsp;&nbsp;TPair     = Record<br>&nbsp;&nbsp;&nbsp;&nbsp;Home     : Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Away     : Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Round    : Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Desc     : String;<br>&nbsp;&nbsp;End;<br>&nbsp;&nbsp;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>&nbsp;&nbsp;bAddedBye        : Boolean;<br>&nbsp;&nbsp;iGamesPerRound   : Integer;<br>&nbsp;&nbsp;iRounds          : Integer;<br>&nbsp;&nbsp;Teams            : Array of Integer;<br>&nbsp;&nbsp;I,J              : Integer;<br>&nbsp;&nbsp;iRound           : Integer;<br>&nbsp;&nbsp;iTeam            : Integer;<br>&nbsp;&nbsp;iGame            : Integer;<br>&nbsp;&nbsp;iTotalGames      : Integer;<br>&nbsp;&nbsp;iPair            : Integer;<br>&nbsp;&nbsp;iLastTeam        : Integer;<br>&nbsp;&nbsp;iSaveTeam        : Integer;<br>&nbsp;&nbsp;Pair             : TPair;<br>begin<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;防止低级错误<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;If iTeams < 2 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;{<br>是否每次都有一场轮空?<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;If iTeams Mod 2 = 0 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;bAddedBye      := False<br>&nbsp;&nbsp;Else<br>&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;bAddedBye      := True;<br>&nbsp;&nbsp;&nbsp;&nbsp;iTeams         := iTeams + 1;<br>&nbsp;&nbsp;End;<br>&nbsp;&nbsp;iRounds          := iTeams - 1;<br>&nbsp;&nbsp;iGamesPerRound   := iTeams Div 2;<br>&nbsp;&nbsp;{<br>确定比赛总场数<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;iTotalGames      := iRounds * iGamesPerRound;<br>&nbsp;&nbsp;SetLength (Pairings,iTotalGames);<br>&nbsp;&nbsp;{<br>为除第一队外的所有队伍建立数组。<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;SetLength (Teams,iTeams - 1);<br>&nbsp;&nbsp;iTeam            := 1;<br>&nbsp;&nbsp;iLastTeam        := iTeams - 2;<br>&nbsp;&nbsp;For I := 0 To iLastTeam Do<br>&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;iTeam          := iTeam + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;If bAddedBye And (iTeam = iTeams) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Teams [I]    := BYE_GAME<br>&nbsp;&nbsp;&nbsp;&nbsp;Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Teams [I]    := iTeam;<br>&nbsp;&nbsp;End;<br>&nbsp;&nbsp;{<br>按逆时针方向使队伍循环。第一队保持不变。下面的例子示范10支队伍的情形。<br>&nbsp;&nbsp;&nbsp;&nbsp;1-10   1-9   1-8   1-7   1-6   1-5    1-4    1-3    1-2<br>&nbsp;&nbsp;&nbsp;&nbsp;2-9   10-8   9-7   8-6   7-5   6-4    5-3    4-2    3-10<br>&nbsp;&nbsp;&nbsp;&nbsp;3-8    2-7  10-6   9-5   8-4   7-3    6-2    5-10   4-9<br>&nbsp;&nbsp;&nbsp;&nbsp;4-7    3-6   2-5  10-4   9-3   8-2    7-10   6-9    5-8<br>&nbsp;&nbsp;&nbsp;&nbsp;5-6    4-5   3-4   2-3  10-2   9-10   8-9    7-8    6-7<br><br>处于第一位的是主队。因为第一队总是主队,所以我会交换那支队伍。我通常在表中把轮空当成是一支客队。<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;iPair            := 0;<br>&nbsp;&nbsp;For iRound := 1 To iRounds Do<br>&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;iTeam          := 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;For iGame := 1 To iGamesPerRound Do<br>&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;With Pairings [iPair] Do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Round      := iRound;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Desc       := '';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If iTeam = 0 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>      把第一队换成主场,强行使轮空当成是客队。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (iRound Mod 2 = 0) And (Teams [iLastTeam] > 0) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Home   := Teams [iLastTeam];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Away   := 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Home   := 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Away   := Teams [iLastTeam];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保证轮空是客队。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Teams [iTeam - 1] > 0 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Home   := Teams [iTeam - 1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Away   := Teams [iLastTeam - iTeam];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Home   := Teams [iLastTeam - iTeam];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Away   := Teams [iTeam - 1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iTeam        := iTeam + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iPair        := iPair + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;End;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使队伍循环<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;iSaveTeam      := Teams [iLastTeam];<br>&nbsp;&nbsp;&nbsp;&nbsp;For I := iLastTeam DownTo 1 Do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Teams [I]    := Teams [I - 1];<br>&nbsp;&nbsp;&nbsp;&nbsp;Teams [0]      := iSaveTeam;<br>&nbsp;&nbsp;End;<br>&nbsp;&nbsp;{<br>用浮泡排序法把最低的主队放在前面。<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;For I := 0 To iTotalGames - 1 Do<br>&nbsp;&nbsp;&nbsp;&nbsp;For J := I + 1 To iTotalGames - 1 Do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (Pairings [J].Round = Pairings [I].Round) And<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Pairings [J].Home < Pairings [I].Home) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pair         := Pairings [J];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pairings [J] := Pairings [I];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pairings [I] := Pair;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End;<br>end;<br><br>end.<br><br><br>这里给出打印循环赛程的简易方法。<br><br>procedure TfrmMain.btnMakeScheduleClick(Sender: TObject);<br>var<br>&nbsp;&nbsp;Pairings   : TPairings;<br>&nbsp;&nbsp;I,J        : Integer;<br>&nbsp;&nbsp;iRounds    : Integer;<br>begin<br>&nbsp;&nbsp;RichEdit1.Clear;<br>&nbsp;&nbsp;iRounds    := StrToIntDef (edtRounds.Text,2);<br>&nbsp;&nbsp;MakeSchedule (Pairings,iRounds);<br>&nbsp;&nbsp;J          := 0;<br>&nbsp;&nbsp;For I := Low (Pairings) To High (Pairings) Do<br>&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另一轮比赛<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;If Pairings [I].Round <> J Then<br>&nbsp;&nbsp;&nbsp;&nbsp;Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J      := Pairings [I].Round;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RichEdit1.Lines.Add ('Round ' + IntToStr (J));<br>&nbsp;&nbsp;&nbsp;&nbsp;End;<br>&nbsp;&nbsp;&nbsp;&nbsp;If Pairings [I].Away < 1 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RichEdit1.Lines.Add ('  Home : ' + IntToStr (Pairings [I].Home) + '  Away : BYE')<br>&nbsp;&nbsp;&nbsp;&nbsp;Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RichEdit1.Lines.Add ('  Home : ' + IntToStr (Pairings [I].Home) + '  Away : ' +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntToStr (Pairings [I].Away));<br>&nbsp;&nbsp;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 + -