导读:
问题描述:
设有n(n = 2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他
n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。试按此要求为比赛安排日程:
(1) 每个选手必须与其他n-1个选手各赛一场;
(2) 每个选手一天只能赛一场;
(3) 循环赛一共进行n-1天。
编程思想:
假设n位选手被顺序编号为1,2,...,n,比赛的日程表是一个n行n-1列的表格,i行j列的表格内容是第i号选手在第j天的比赛对手。
根据分而治之的原则,可从其中一半选手(2^(n-1位)的比赛日程,导出全体n位选手的日程,最终细分到只有两位选手的比赛日程出发。
编程图例: n=8 =====================================================================
|*| 选手 1天 2天 3天 4天 5天 6天 7天 |*| =====================================================================
|*| 1号 | 2 | 3 | 4 || 5 | 6 | 7 | 8 |*|
|*| 2号 | 1 | 4 | 3 || 6 | 7 | 8 | 7 |*|
|*| 3号 | 4 | 1 | 2 || 7 | 8 | 5 | 6 |*|
|*| 4号 | 3 | 2 | 1 || 8 | 5 | 6 | 5 |*|
|*| 5号 | 6 | 7 | 8 || 1 | 4 | 3 | 2 |*|
|*| 6号 | 5 | 8 | 7 || 2 | 1 | 4 | 3 |*|
|*| 7号 | 8 | 5 | 6 || 3 | 2 | 1 | 4 |*|
|*| 8号 | 7 | 6 | 5 || 4 | 3 | 2 | 1 |*|
=======================================================================
// 代码如下:
void matchtable(int a[][N], int k)
...{
int n=1, m=1
for (int i=1 i<=k; i++)
n *= 2
for(int i=0 i
a[i][0]=i+1
for(int s=0 s
...{
n /= 2
for(int t=0 t
...{
for(int j=m; j<2*m; j++)
for(int i=m; i<2*m; i++)
...{
// 类似于fft中的蝴蝶算法操作,十字形交叉赋值
a[i-m+2*t*m][j] = a[i+2*t*m][j-m]; // /
a[i+2*t*m][j] = a[i-m+2*t*m][j-m]; //
}
}
m *= 2
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1535717
本文转自
http://blog.csdn.net/strollerV/archive/2007/03/20/1535717.aspx
问题描述:
设有n(n = 2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他
n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。试按此要求为比赛安排日程:
(1) 每个选手必须与其他n-1个选手各赛一场;
(2) 每个选手一天只能赛一场;
(3) 循环赛一共进行n-1天。
编程思想:
假设n位选手被顺序编号为1,2,...,n,比赛的日程表是一个n行n-1列的表格,i行j列的表格内容是第i号选手在第j天的比赛对手。
根据分而治之的原则,可从其中一半选手(2^(n-1位)的比赛日程,导出全体n位选手的日程,最终细分到只有两位选手的比赛日程出发。
编程图例: n=8 =====================================================================
|*| 选手 1天 2天 3天 4天 5天 6天 7天 |*| =====================================================================
|*| 1号 | 2 | 3 | 4 || 5 | 6 | 7 | 8 |*|
|*| 2号 | 1 | 4 | 3 || 6 | 7 | 8 | 7 |*|
|*| 3号 | 4 | 1 | 2 || 7 | 8 | 5 | 6 |*|
|*| 4号 | 3 | 2 | 1 || 8 | 5 | 6 | 5 |*|
|*| 5号 | 6 | 7 | 8 || 1 | 4 | 3 | 2 |*|
|*| 6号 | 5 | 8 | 7 || 2 | 1 | 4 | 3 |*|
|*| 7号 | 8 | 5 | 6 || 3 | 2 | 1 | 4 |*|
|*| 8号 | 7 | 6 | 5 || 4 | 3 | 2 | 1 |*|
=======================================================================
// 代码如下:
void matchtable(int a[][N], int k)
...{
int n=1, m=1
for (int i=1 i<=k; i++)
n *= 2
for(int i=0 i
a[i][0]=i+1
for(int s=0 s
...{
n /= 2
for(int t=0 t
...{
for(int j=m; j<2*m; j++)
for(int i=m; i<2*m; i++)
...{
// 类似于fft中的蝴蝶算法操作,十字形交叉赋值
a[i-m+2*t*m][j] = a[i+2*t*m][j-m]; // /
a[i+2*t*m][j] = a[i-m+2*t*m][j-m]; //
}
}
m *= 2
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1535717
本文转自
http://blog.csdn.net/strollerV/archive/2007/03/20/1535717.aspx