C 迴圈賽日程表演算法

2021-06-18 17:16:30 字數 1043 閱讀 7192

最近我在學演算法設計與分析裡面的分治策略,遇到迴圈賽日表這個題目時卡了一下,上網谷歌了一會,發現上面有一些演算法對於我這樣智商不高的童鞋,有點難以看懂。好吧,睡了乙個晚上,第二天早上發現想通了~

題目是這樣的:編寫程式實現迴圈賽日程表。設有n=2^k(2的k次方)個隊伍要進行迴圈賽。現要設計乙個滿足以下要求的比賽日程表:(1)每個隊伍必須與其它n-1個隊伍各賽一次(2)每個隊伍一天只能賽一場(3)迴圈賽進行n-1天

分析:以k=3為例(n = 2^3 = 8),可得到如下賽日表:

以**中心為拆分點,將**分成4*4個格仔的a、b、c、d四個部分,容易看出右下角的d與左上角的a資料相同,右上角的b與左下角的c相同,同樣的規律適用於再次劃分後得到的更小的部分;這樣對8個隊伍的賽日安排就變成了對4個隊伍的賽日安排,然後進一步又變成了對兩個隊伍的賽日進行安排。

程式設計思路:將n*n個格仔,也就是n階方陣從中間十字劃分,一次劃分分成四塊,令其右上角和左下角的資料完全相同,右下角和左上角的資料完全相同;每次劃分都得到了若干個n/2階的方陣,然後對這些方陣進行操作,繼續令其右上角和左下角的資料完全相同,右下角和左上角的資料完全相同,如此迴圈下去,直至n<2時結束遞迴。現在問題就變成了如何程式設計能令方陣二維陣列的左上角資料複製到右下角去,左下角的資料複製到右上角去。

以下為**片段:

其中二維陣列saicheng為全域性變數

//安排賽程的函式,x,y為二維陣列方陣左頂角的格仔座標,num為該方陣總行數(總列數)

迴圈賽日程表演算法

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

迴圈賽日程表

對於書上那個日程表的實現,第三版的課本給出了迴圈實現的方法,不過這個表的生成明顯要用遞迴方法生成更為合適,此表如下 可以看到每次該錶的生成總可以分成四個字表的填充過程,初始化讓左邊第一列填充上之後,然後每一次先遞迴填充左上角的子表,然後再填充左下角的子表,然後右上和右下的子表用copy的方法填充,實...

迴圈賽日程表

設有n個選手進行迴圈比賽,其中n 2 m,要求每名選手要與其他n 1名選手都賽一次,每名選手每天比賽一次,迴圈賽共進行n 1天,要求每天沒有選手輪空。輸入第一行為t,表示資料組數,對於每組資料就乙個m 1 m 10 對於每組輸入的m,輸出 形式的比賽安排表 1 3 1 2 3 4 5 6 7 8 2...