遞迴與分治策略 2 11迴圈賽日程表

2021-08-10 00:09:52 字數 1443 閱讀 4823

設有n=2^k個運動員要進行網球迴圈賽,現要設計乙個滿足以下要求的比賽日程表:

(1)每個選手必須與其他n-1個選手各賽一次;

(2)每個選手一天只能賽一次;

(3)迴圈賽一共進行n-1天。

按此要求在表中第i行和第j列處填入第i個選手在第j天所遇到的選手。

按分治策略,將所有的選手分為兩半,n個選手的比賽日程表就可以通過為n/2個選手設計的比賽日程表來決定。遞迴地用對選手進行分割,直到只剩下2個選手時,比賽日程表的制定就變得很簡單。這時只要讓這2個選手進行比賽就可以了。

演算法如下:

public

class

test2_11

m *= 2;}}

public

static

void

main(string args) }}

執行結果如下:

1 2 3 4 5 6 7 8 

2 1 4 3 6 5 8 7

3 4 1 2 7 8 5 6

4 3 2 1 8 7 6 5

5 6 7 8 1 2 3 4

6 5 8 7 2 1 4 3

7 8 5 6 3 4 1 2

8 7 6 5 4 3 2 1

迴圈賽日程表列印出來了,可是計算機是按照怎樣的次序列印的呢?如下圖,第一列都是0因為謄抄是從第二列開始,次序從小到大表示先後列印次序

0 2 10 12 26 28 30 32 

0 1 14 16 34 36 38 40

0 4 9 11 42 44 46 48

0 3 13 15 50 52 54 56

0 6 18 20 25 27 29 31

0 5 22 24 33 35 37 39

0 8 17 19 41 43 45 47

0 7 21 23 49 51 53 55

補充:此演算法是以固定列按行劃分組,如果想固定行按列劃分組,只需將第10行改為a[1][i]=i;以及第19行和21行演算法改為:

a[i][j+(t-1)*2*m] = a[i-m][j+(t-1)*2*m-m];  

a[i][j+(t-1)*2*m-m] = a[i-m][j+(t-1)*2*m];

迴圈賽日程表 分治 遞推 遞迴

設有n 2 k個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各賽一次 2 每個選手一天只能參賽一次 3 迴圈賽在n 1天內結束。請按此要求將比賽日程表設計成有n行和n 1列的乙個表。在表中的第i行,第j列處填入第i個選手在第j天所遇到的選手。其中1...

迴圈賽日程表(分治)

設有 n 2的k次方 個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各自賽一次。2 每個選手一天只能賽一次。3 迴圈賽一共進行n 1天。按分治策略,我們可以將所有的選手分為兩半,n個選手的比賽日程表可以通過n 2個選手設計的比賽日程表來決定。遞迴地...

分治法 迴圈賽日程表

設有n 2k個運動員要進行羽毛球迴圈賽,現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其它n 1個選手各賽一次 2 每個選手一天只能比賽一次 3 迴圈賽一共需要進行n 1天。由於n 2 k,顯然n為偶數。按分治策略,將所有的選手分為兩半,n個選手的比賽日程表就可以通過為n 2個選手設計的比...