一个调度问题。
选手人数为n=2^k,进行网球循环赛。现在我们需要设计一个满足以下要求的比赛日程:
(1).每个玩家必须与其他 n-1 名玩家玩一场游戏。
(2).每位玩家每天只能参加一次比赛
(3)。循环赛共持续n-1天。
7天内8名选手的赛程应该有不同的安排。可以理解为一个8行7列的矩阵。
8个人直接互相安排肯定会很乱。如果能先安排好4个人的日程,那就是4*3的矩阵,会简单很多。以此类推,安排2个人的日程是最容易的。
这时候就用了分而治之的方法,但是无法和自身进行比较,导致正常情况下是8*7的矩阵。因此网球单循环赛,我们假设有一个8*8的矩阵,相比于一天,这样更方便分而治之的策略。
如下网球单循环赛,2人排队后网球单循环赛,在4人的排列中,3号和4号会模仿1号和2号球员,然后在中心对称交换,以此类推。
代码实现:
其代码实现起来稍微容易一些,只要注意数组所代表的含义即可。
#include
#include
#include
void Table(int a[][99],int k)
{
int i,j,s,t,m=1;//共需t次划分
int n=pow(2,k);
for(i=1;i<=n;i++)
a[1][i]=i;
for(s=1;s<=k;s++)
{
n=n/2;
for(t=1;t<=n;t++)
for(i=m+1;i<=2*m;i++)
for(j=m+1;j<=2*m;j++)
{
a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];
a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];
}
m=m*2;
}
}
int main()
{
int n,i,j,k;
printf("请输入k:");
scanf("%d",&k);
n=pow(2,k);
int table[99][99];
memset(table,0,sizeof(table));
Table(table,k);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",table[i][j]);
printf("\n");
}
return 0;
}
由于本人水平有限,只是算法初学者,文章中的内容难免存在错误和不足。诚恳请求您的批评和指正。也欢迎您与我交流,共同学习,共同进步。
最新直播
中长跑与短跑技术要点解析:摆臂与落地动作技巧详解
汪顺连续三届奥运登领奖台,巴黎奥运会男子200米个人混合泳摘铜
2009年国际排球比赛规则更新:院排球联赛比赛规则详解
马术小组课教学在中国面临的挑战与优势解析:家长疑虑与解决方案
2018中国铁建马术青训营重庆首站圆满落幕,冠军教练助力重庆马术行业升级
排球女将 1979在线观看:荒木由美子主演的经典日本剧,豆瓣高分推荐
排球女将免费在线观看平台及主演信息全解析
卢布列夫因对线审吼叫被直接判负,ATP迪拜站半决赛引发热议
萨芬告别赛季回顾:霍普曼杯亚军、澳网对阵费德勒、法网罗兰加洛斯告别战
鹤岗网球场建设:选择环保硅PU材料,众建宏体育公司专业施工
JRKAN直播 版权所有 XML地图 备案号:晋ICP备2024029651号
JRKAN直播JRS直播吧是国内最好的体育直播网站,JRKAN直播内容由互联网收集整理,主要提供足球直播、篮球直播,电竞直播,我们努力做最好的直播吧