迴圈日程表問題

2021-07-12 05:42:57 字數 2979 閱讀 7397

迴圈日程表問題。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=2

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

遞迴填充方式

因為 (

0,0)

初始化為 1

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

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

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

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

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

4個子**,遞迴出口為 n

8 填充一次後的日程表

void circulateschedule(int row, int column, int n) 

// 將2^k*2^k的**分成2^(k-1)*2^(k-1)的四個子**

int half = n / 2;

// 每個**的左上角賦值

// 左上子**等於右下子**,右上子**等於左下子**

// 右上子**等於左上子**加上子**大小

table[row + half][column + half] = table[row][column];

table[row][column + half] = table[row + half][column] = table[row][column] + half;

// 遞迴四個子**

circulateschedule(row, column, half);

circulateschedule(row, column + half, half);

circulateschedule(row + half, column, half);

circulateschedule(row + half, column + half, half);

}

#include 

using

namespace

std;

const

int maxnum = 1

<< 10;

int table[maxnum][maxnum];

void circulateschedule(int row, int column, int n)

// 將2^k*2^k的**分成2^(k-1)*2^(k-1)的四個子**

int half = n / 2;

// 每個**的左上角賦值

// 左上子**等於右下子**,右上子**等於左下子**

// 右上子**等於左上子**加上子**大小

table[row + half][column + half] = table[row][column];

table[row][column + half] = table[row + half][column] = table[row][column] + half;

// 遞迴四個子**

circulateschedule(row, column, half);

circulateschedule(row, column + half, half);

circulateschedule(row + half, column, half);

circulateschedule(row + half, column + half, half);

}int main()

// 初始化(0,0)點

table[0][0] = 1;

// 生成迴圈日程表

circulateschedule(0, 0, n);

// 輸出表

for(int i = 0; i < n; i++)

cout

<< endl << endl << endl;}}

return

0;}

請輸入選手個數,0則退出程式:221

請輸入選手個數,0則退出程式:423

4143

4123

21請輸入選手個數,0則退出程式:823

4567

8143

6587

4127

8563

2187

6567

8123

4587

2143

8563

4127

6543

21請輸入選手個數,0則退出程式:0

process returned 0 (0x0) execution time : 27.790 s

press any key to continue.

迴圈日程表問題

今天做一道相對簡單的題。1.n 2 k個運動員進行網球迴圈賽,需要設計比賽日程表。每個選手必須與其他n 1個選手各比賽一次 每個選手每天只能比賽一次 迴圈賽一共進行n 1天。按此要求設計一張比賽日程表,該錶有n行,n 1列,第i行j列為第i個選手第j天遇到的選手。解題思路 利用分治原理 從大的 日程...

迴圈日程表

問題 設有n 2k個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 每個選手必須與其他n 1個選手各賽一次,每個選手一天只能賽一次,迴圈賽一共進行n 1天。分析分治思想,k的日程表是通過k 1的日程表通過相加得到 include include using namespace std ...

迴圈比賽日程表

總時間限制 1000ms 記憶體限制 65535kb 描述 設有n個選手進行迴圈比賽,其中n 2 m,要求每名選手要與其他n 1名選手都賽一次,每名選手每天比賽一次,迴圈賽共進行n 1天,要求每天沒有選手輪空。輸入m m 10 輸出 形式的比賽安排表 數字之間以乙個空格分開 樣例輸入 3 樣例輸出 ...