迴圈賽賽程安排 遞迴思想

2021-06-20 23:10:41 字數 1239 閱讀 2711

今天上午準備學習一道演算法,拿到一本《計算機演算法設計、分析與實現》書,翻開一道迴圈賽賽程安排的題目。要求大致是這樣的:

要求有n=2^k名網球運動員進行輪流賽,每個人都要與其他n-1名隊員打一場比賽;

比賽在n-1天內必須結束;

每個球隊每天只能打一場比賽;

試給出安排方案。

這裡我們用乙個最熟悉的思想來解決----遞迴。這樣理解,假設有n個球員,我們先不管別的,一分兩半只關心n/2名球員的安排,以此類推直到最後只剩下兩名隊員12

21圖一發現結果是上面(圖一)這樣的,如果看不出有什麼規律,那我們就拿4名球員來往外擴充套件: 12

3421

4334

1243

21 圖二

這樣,我們能發現,如果我們以圖二左上角的四個數為參照矩陣,右上角分別是在左上角矩陣的基礎上為每個元素增加了矩陣寬度的一半,左下角與右上角保持一致,只是位置發生了位移,右下角的元素是在左上角元素位移得來的。得到這樣的規律後,我們就發現問題變得異常簡單了。按照正常的思路,我們不用關心矩陣的大小,也就是說不管有多少參賽隊員,儘管放馬過來,我來隨便的為你們分組,一刀少一半,在一刀又少一半,最後只剩下兩個人了。好了,基本不用安排了,比賽的第一天就是你打他(他打你)。

基於這種把問題由大化小,由小化簡單的思想,同時我們發現了矩陣的規律。那我們就先建立出左上角的子矩陣,然後基於左上角的子矩陣得到其他子矩陣。

**分析實現:

反思:這個方法雖然巧妙但卻不是從問題的原點分析出來的,而是總結矩陣的規律獲得的方法。不過好在**中實現了遞迴的思想,使問題變得簡單了。在儲存矩陣的時候,我在本**的其他高手寫的部落格有人使用的是一維陣列,動態開闢儲存空間,方法很好也很巧妙;絕大多數人使用的還是二維陣列儲存。當然,這不是關鍵,最主要的是我們在處理子矩陣複製的時候,**注釋很少,小弟頭腦簡單,覺得這種方法亦能解決問題,就ok了。

迴圈賽程安排

include stdio.h 為參加網球比賽的選手安排比賽日程,設有n 2k 位選手參加網球迴圈賽,迴圈賽共進行n 1天,每位選手要與其他n 1位選手都賽一場,且每位選手每天賽一場,不輪空。define maxlen 100 int b maxlen 2 記錄所有比賽場次對手 int j 0 比賽...

單迴圈賽程安排問題

首先,來解釋一下,什麼是單迴圈問題,其實,這是乙個我們在實現中經常遇到的問題。問題描述 賽程問題 有n個運動員進行單迴圈賽,即兩個運動員都要與其他所有運動員比賽一次。要求每個運動員每天只進行一次比賽,且整個賽程在n 1天內結束,運動員編號由1到n 注 n 2 k 解題思想 看到這個問題,我們的第一種...

單迴圈賽程安排問題

首先,來解釋一下,什麼是單迴圈問題,其實,這是乙個我們在實現中經常遇到的問題。問題描述 賽程問題 有n個運動員進行單迴圈賽,即兩個運動員都要與其他所有運動員比賽一次。要求每個運動員每天只進行一次比賽,且整個賽程在n 1天內結束,運動員編號由1到n 注 n 2 k 解題思想 看到這個問題,我們的第一種...