參考部落格
迴圈日程表問題。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 5view codeusing
namespace
std;
6const
int max = 100;7
intg[max][max];
8void circulateschedule(int row, int col, intn)9
20int
main()
2132
return0;
33 }
迴圈賽日程表 分治 遞推 遞迴
設有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天遇到的選手。該問題和棋盤問題很像,都可以通過遞...