迴圈日程表問題。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 樣例輸出 ...