設有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個選手設計的比...