分治法之迴圈賽日程表的理解和解題思路

2021-08-20 14:32:59 字數 1157 閱讀 2377

一、

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

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

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

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

將比賽日程表設計成n行n列,表中除了第一列,其他n-1列才是我們要的,陣列下標行列都從0開始,第i行j列代表第(i+1)位選手在第j天的對手:

以8個選手為例子,下面是填表的步驟:

①我們先初始化第一行各個數為1~8;

②因為是遞迴,那麼要填8x8的左下角和右下角,分別需要知道它的右上角和左上角

③而8x8的盒子它的左上角是乙個4x4的盒子,要填4x4的左下角和右下角,也分別需要知道它的右上角和左上角

④現在遞迴到4x4的盒子的左上角,是乙個2x2的盒子,它不需要遞迴了,直接沿對角線填左下角和右下角的數字,也就是上面的圖②

⑤可以看到,經過上面的②③步,我們左上角4x4的盒子,它的·右上角和左上角已經知道了,那就可以沿對角線填它的左下角和右下角了,所以出現了圖④

⑥其他的依次類推

通俗易懂地講,就是如果你想填乙個大的,你得先得出它左上角和右上角兩個盒子,再沿對角線分別抄到右下角和左下角。而為了得出它左上角和右上角,就需要遞迴了。

下面是我原始碼(如有問題,歡迎各位大牛指出哈~~):

#include using namespace std;

#define n 50

//列印盒子

void print(int n,int game[n])

//填左下角

for(int i=p+t/2;i> n;

//初始化第一行,其他全為0

for(int i=0;i

}//遞迴

arrange(0,0,n,game);

//列印輸出迴圈賽日程表

print(n,game);

system("pause");

return 0;

}

分治法 迴圈賽日程表

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

迴圈賽日程表 分治法

設有n 2 k個運動員,要進行網球迴圈賽。現在要設計乙個滿足以下要求的比賽日程表,每個選手必須與其他n 1個選手各賽一場,每個選手一天只能賽一次,迴圈賽一共進行n 1天,將比賽日程表設計成n行n列,表中除了第一列,其他n 1列才是我們要的,陣列下標行列都從0開始,第i行j列代表第 i 1 位選手在第...

迴圈賽日程表(分治)

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