单循环赛的算法问题

基本原理:
如第一轮
数组第一个与最后一个元素对应,第二个与倒数第二个对应,其余类推
如果遇到与自身对应,则定为自身与最后一个元素对应
以上为除最后一个元素外其他元素的对应,最后一个元素的对应算法等下再说

第二轮
数组第一个元素现在将与倒数第二个元素对应,相似,第2则与倒数第3对应,其他类推,与自己对应的时候仍然遵循第一轮说到的那个处理规则

说到这里,就可以写出获取最后一个元素以前的其他元素每一轮的对阵信息了

现在来说最后一个元素的对阵信息获取
最后一个元素每轮的对阵元素有一个规律,就是除了第一轮是固定与第一个元素对应后,从第二轮开始,将整个数组除了最后一个元素和第一个元素外的其他元素拆分成两个数组,都是以在原来数组中的index的降序排列,然后以一隔一的方式合并这两个数组,如10个元素为例,拆分的两个数组为5,4,3,2和9,8,7,6
再一隔一合并它们,变成5,9,4,8,3,7,2,6,这个8个元素就分别是原来数组中最后一个元素在除了第一轮后每轮的对阵对手了

所以,最后一个元素的对阵情况是这样获得的,如果是第一轮,它遵循其他元素的对阵获取规则,否则,按上面说的获取对阵队伍信息

以上为队伍数量为偶数时的算法,如果队伍数量为奇数的话,则给数组加一个元素,赋给它空值""以补奇为偶,然后每轮对阵此空值的则为轮空队伍

ASP代码:

<%
Dim d,L,Temp1(),Temp2(),Temp3(),LoopNum

d = array("国际米兰","尤文图斯","罗马","拉齐奥","切沃","博洛尼亚","锡耶纳","卡利亚里","布雷西亚","AC米兰","乌迪内斯")

L = Ubound(d)

If L mod 2 = 0 Then '单数补双

ReDim Preserve d(L+1)
d(L+1) = ""
L = L + 1
End If

LoopNum = Cint(Request("Loop")) - 1 '轮次-1
If LoopNum < 0 Or Not IsNumeric(LoopNum) Then LoopNum = 0 Function GetVs(Index,n) '根据index和轮次获取对于此index的d中元素在对应轮次的对阵对手
GetVs = ""
Dim i
i = L - n - Index + 1
If i < 0 Then i = L + i
GetVs = i
If i = Index - 1 Then GetVs = L
If Index = L + 1 And n > 0 Then
Redim Temp1((L - 1) / 2 - 1)
Redim Temp2((L - 1) / 2 - 1)
Redim Temp3(L - 1)
For i = 1 To (L - 1) / 2
Temp1(i - 1) = 9 - i
Next
For i = (L - 1) / 2 + 1 To L - 1
Temp2(i - ((L - 1) / 2 + 1)) = 9 - i
Next
Dim i1,i2
i1 = 0
i2 = 0
For i = 0 to n - 1
If i Mod 2 <> 0 And i <> 0 Then
Temp3(i) = Temp1(i1)
i1 = i1 + 1
Else
Temp3(i) = Temp2(i2)
i2 = i2 + 1
End If
Next
'for each a in temp3
'response.write n & "
"
'next
'response.end

GetVs = Temp3(n-1)

End If
End Function

'Response.write GetVs(10,LoopNum)
'response.end

If Request("d") = "" Or Not IsNumeric(Request("d")) Then
dIndex = L + 1
Else
dIndex = Cint(Request("d"))
End If

response.write "参加比赛的队伍有:"
for i = 0 to L
response.write d(i)
if i <> L Then
If d(i + 1) <> "" then response.write ","
End If
next
response.write "

选择查看 "

response.write " 在"

response.write " 的对阵情况 "
response.write "


第 [ " & LoopNum + 1 & " ] 轮的比赛"
If dIndex > L Then
response.write " [ 所有球队 ] "
Else
response.write " [ " & d(dIndex) & " ] "
End If

response.write "的对阵安排如下

"

dim Temp()
redim temp(L)
for i = 0 to L
temp(i) = "NoneMatch"
Next

If dIndex > L Then
for i = 0 to L
If temp(i) = "NoneMatch" Then
Vs = d(GetVs(i+1,LoopNum))
If Vs = "" Then
response.write "

"
Else
response.write "

"
End If

temp(GetVs(i+1,LoopNum)) = i
End If
next
Else
Vs = d(GetVs(dIndex+1,LoopNum))
If Vs <> "" Then
response.write "

"
Else
response.write "

"
End If
End If
response.write "

" & d(i) & " [ 本轮轮空 ]
" & d(i) & " VS " & Vs & "
" & d(dIndex) & " VS " & Vs & "
" & d(dIndex) & " [ 本轮轮空 ]

"
%>