多邊形法 解決迴圈賽問題(n分為奇數和偶數)

2021-09-29 02:06:25 字數 1874 閱讀 1914

看到網上關於迴圈賽問題提出過一種多邊形法,感覺這個思路挺簡單的,但是看別人**沒看懂,這裡我簡單分析幾種情況然後寫出自己理解的**:

這個其實就是每次以某乙個運動員為對稱軸,分割之後對稱的一組比賽,剩下的一輪空也就是和0號組成一對。

總結

那麼問題來了,怎樣用**將以上問題描述出來呢,我們可以看到,對於n = 5中五天的賽程安排第二天就是在第一天的基礎上迴圈加1(0不變,5 = (5 + 1)% 5, 其餘的1、2、3、4自加就可以),對比之後其實所有的情況都是這樣的,這樣就可以經過n = 5次迴圈就得到所有的安排。

問題的合併考慮,對於所有情況,我們也像分治法一樣全部轉化為偶數情況(為了輸出考慮),但是考慮問題得到時候用奇數多邊形考慮(也就是考慮問題時候將以上的0全部換成相應的偶數,然後輸出的時候依據情況而定)

演算法設計

我們只需要分出第一天的安排就可以,然後其餘的就根據規律一次求解。

對於n = 5,我們考慮陣列[1,2,3,4,5,6],分成兩半:對應關係就出來了:

第一天即為:(1,6) (2,5) (3,4)

然後其餘賽程即是迴圈加法就可以(6不變,5 = (5 + 1)% 5, 1,2,3,4自加)完整**如下:

# include

using

namespace std;

//多邊形法--序列對

void

table

(int n,

int*

*a)for

(int i =

2; i <= m+

1; i ++

)else

for(j =

1; j <=

(m +1)

/2; j++)}

for(

int i =

0; i < m;

++i)

delete

b[i]

;delete

b;}void

display

(int n,

int*

*a)}

else

//n為偶數時候的輸出

for(

int i =

1; i <= n; i++)}

}int

main()

另外前面我說王曉東書上答案的那段**如下,我其實沒怎麼看懂,但是感覺很nb,我試了試是可以解出答案的,我貼在下面

//多邊形法--網上

void

table1

(int n,

int*

*p_array)

for(i =

1; i <= m;

++i)

}}

測試樣例 輸入:只需輸入整數n

 輸出:輸出矩陣,第一列代表幾號運動員,第二列到第n(n-1)列代表該天賽程(0表示改天輪空)

 測試結果(均在vscode上面輸出)

分治法 解決迴圈賽問題(n分為奇數和偶數)

例題 設有n個運動員要進行網球迴圈賽,設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各賽一次 2 每個選手一天只能賽一次 3 當n 是偶數,迴圈賽進行n 1簡單天,當n是奇數,迴圈賽進行n天。分析 1.首先考慮簡單問題 n 2 k 這個我先上乙個圖大家應該就可以明白 應該很容易...

迴圈賽日程表的多邊形解法

迴圈賽要求比賽的每兩個選手都要進行一次比賽,而且每個選手每天都要比賽一場。這種題目的解法通常是用分治的思想來做,並且是分治方法解題的經典題目。下面的一種受多邊形啟發的方法,也能巧妙解決迴圈賽日程表問題。如圖所示,有八個選手要進行迴圈賽,畫七邊形,每個點表示乙個選手。其中最高點所代表的選手與第八位選手...

凸多邊形區域劃分為三角形問題

rt 乙個凸多邊形區域,有n條邊,將其劃分為三角形區域,問共有多少種分割方法。1.我們從最簡單情況開始 n 3,f 3 1 2.當n 4,f 4 2 3.n邊時 我們從節點1開始考慮,要想分割成三角形區域,1不能和與它相鄰的點連線,所以1可以連線3,4,n 1 假設1連線i,則分割成的兩個區域分別為...