蜘蛛抱蛋 发表于 2010-11-25 19:43:29

分治算法

本帖最后由 蜘蛛抱蛋 于 2010-11-26 11:25 编辑

问题是:某次球赛为循环制,n位选手参赛,赛程n-1天,每位选手都必须与其他每位选手比赛一次,最后按积分排名选出优胜者。要求每人每天都要赛一场。用程序计算出日程安排。为了简化过程,参赛选手数量为2的N次方

要用到算法里的 分治算法   大家可以试一试~

**** Hidden Message *****

pusofalse 发表于 2010-11-25 21:45:33

分治是最基础的算法?~ 我看着怎么这么难啊。 - -|||

zch11230 发表于 2010-11-25 21:52:21

没认真读书头一次听说分治算法

www378660084 发表于 2010-11-25 21:58:16

12
13 28
14 23 37
15 24 38 46
16 25 34 47
17 26 35 48
18 27 36 45

www378660084 发表于 2010-11-25 22:01:23

手机上,不方便写代码.没听过分治

3mile 发表于 2010-11-26 00:13:49

本帖最后由 3mile 于 2010-11-26 00:15 编辑

分治算法?受教了。
用笨方法解决的。不知道正确与否?
**** Hidden Message *****

gapkiller 发表于 2010-11-26 11:10:01

孤陋寡闻了, 没用过最基础的分治算法

蜘蛛抱蛋 发表于 2010-11-26 11:25:55

本帖最后由 蜘蛛抱蛋 于 2010-11-26 11:49 编辑

回复 7# gapkiller

说错话了,我是看书上这么介绍的。。。
回复 6# 3mile

你可能误解了,每人每天只能比赛一场

shenrenba 发表于 2010-11-26 13:32:17

看看 不明白分治算法

3mile 发表于 2010-11-26 13:47:11

本帖最后由 3mile 于 2010-11-26 13:58 编辑

回复 8# 蜘蛛抱蛋
我误解了吗?也许吧。
结果的每一横行为一天的比赛安排。
还是把天数安排加上吧。
#include <array.au3>
Local $a = 0, $temp = 2, $array
Local $input = InputBox('输入', '请输入选手人数', '8')
For $i = 1 To $input
    For $n = $temp To $input
      ReDim $array[$a + 2]
      $array[$a] = '选手' & $i
      $array[$a] = '选手' & $n
      $a += 1
    Next
    $temp += 1
Next
_ArrayDelete($array, UBound($array))
$a = 0
$temp = ''
$array1 = $array
Local $fin, $go
For $n = 0 To $input - 1 - 1
    $temp &= "第" & $n + 1 & "天" & @TAB
    $temp &= $array1[$n] & '对' & $array1[$n] & '|'
    For $i = 0 To UBound($array) - 1
      If Not StringInStr($temp, $array[$i]) And Not StringInStr($temp, $array[$i]) Then
            $temp &= $array[$i] & '对' & $array[$i] & '|'
            $go &= $i & '|'
      EndIf
    Next
    $del = StringSplit(StringTrimRight($go, 1), '|')
    For $y = $del To 1 Step -1
      _ArrayDelete($array, $del[$y])
    Next
    $go = ''
    $fin &= $temp & @CRLF
    $temp = ''
Next
MsgBox(0, 0, $fin)

蜘蛛抱蛋 发表于 2010-11-26 14:35:49

回复 10# 3mile

哦,是我没仔细看,用循环也可以,这个例子只不过为了说明这个算法

gapkiller 发表于 2010-11-29 09:45:18

好递归...
字数补丁..
页: [1]
查看完整版本: 分治算法