一、
問題:設有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個選手設計的比賽日程表來決定。遞迴地...