迴圈日程表問題(分治遞迴)

2022-08-11 12:15:20 字數 1239 閱讀 8150

參考部落格

迴圈日程表問題。n=2k

個運動員進行網球迴圈賽,需要設計比賽日程表。每個選手必須與其他n−1

個選手各賽一次;每個選手一天只能賽一次;迴圈賽一共進行n−1

天。按此要求設計一張比賽日程表,該錶有n

行和n−1

列,第i

行j列為第i

個選手第j

天遇到的選手。

該問題和棋盤問題很像,都可以通過遞迴思想來解。

遞迴三部曲

劃分問題:將n=2k

個運動員劃分為兩組n=2k−1

個運動員。

遞迴求解:遞迴填充n=2k−1

個運動員的日程表,填充方式見下面,遞迴出口為n=1

。合併問題:該問題不需要合併。

將日程表看做是乙個n=2k∗n=2k

的乙個**,先初始化(0,0)

位置為1

,然後將日程表劃分為n=2k−1∗n=2k−1

這樣的四個子**,再按照如下方法填充。

遞迴填充方式

因為(0,0)

初始化為1

了,且每次填充都將其他子**的左上子**左上角預先填充了,所以左上子**的左上角不需要填充。

填充右下子**的左上角為左上子**的左上角值。

填充右上子**的左上角為左上子**的左上角值加上子**當前大小(邊長)。

同上條一樣,填充左下子**的左上角。

填充完畢之後,再遞迴填充4

個子**,遞迴出口為n=1

n=8填充一次後的日程表

分析:他是由四塊拼起來的,左上角是n = 4時的一組解,左下角是左上角每個數加4得到,右上角和右下角分別由左下角和左上角複製得到的。

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6const

int max = 100;7

intg[max][max];

8void circulateschedule(int row, int col, intn)9

20int

main()

2132

return0;

33 }

view code

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

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

遞迴 PTA迴圈日程表

設有n個選手進行迴圈比賽,其中n 2 m,要求每名選手要與其他n 1名選手都賽一次,每名選手每天比賽一次,迴圈賽共進行n 1天,要求每天沒有選手輪空。輸入格式 輸入 m m 7 輸出格式 輸出 形式的比賽安排表。一行各資料間用乙個空格隔開。輸入樣例 3輸出樣例 在這裡給出相應的輸出。例如 1 2 3...

迴圈日程表問題

迴圈日程表問題。n 2k個運動員進行網球迴圈賽,需要設計比賽日程表。每個選手必須與其他n 1 個選手各賽一次 每個選手一天只能賽一次 迴圈賽一共進行n 1 天。按此要求設計一張比賽日程表,該錶有 n 行和n 1列,第 i 行 j列為第 i 個選手第 j天遇到的選手。該問題和棋盤問題很像,都可以通過遞...