《循环赛日程表问题》由会员分享,可在线阅读,更多相关《循环赛日程表问题(9页珍藏版)》请在金锄头文库上搜索。
1、华南师范大学计算机学院 计算机算法作者:杨劲松循环赛日程表循环赛日程表2024/7/212024/7/21内容提要内容提要 问题描述 解题思路 程序实现2/92024/7/21问题描述问题描述问题描述:问题描述: 设有设有n(n = 2k)位选手参加网球循环赛,循环赛共进行位选手参加网球循环赛,循环赛共进行n-1天,每位选手天,每位选手要与其他要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。 每个选手必须与其他n-1个选手各赛一场; 每个选手一天只能赛一场; 循环赛一共进行n-1天。3/92024/7/21解题思路解题思
2、路问题描述:问题描述: 每个选手必须与其他n-1个选手各赛一场; 每个选手一天只能赛一场; 循环赛一共进行n-1天。n=1具体具体抽象抽象n=2选手选手第一天赛事第一天赛事1选手选手第一天赛事第一天赛事12124/92024/7/21解题思路解题思路问题描述:问题描述: 每个选手必须与其他n-1个选手各赛一场; 每个选手一天只能赛一场; 循环赛一共进行n-1天。n=4具体具体抽象抽象选手选手第一天第一天第二天第二天第三天第三天12213434412312435/92024/7/21解题思路解题思路n=8选手选手第一天第一天第二天第二天第三天第三天第四天第四天第五天第五天第六天第六天第七天第七天
3、12345678214365873412765643218765567812346587214378562412876543216/92024/7/21 程序实现程序实现void table(int *a,int start,int end)void table(int *a,int start,int end) if(start = end | start = end | start = end | start = end | start = 0) return; int n = end - start + 1;int m = n/2; int n = end - start + 1;int
4、 m = n/2; int mid = (end + start)/2; int mid = (end + start)/2; for(int i=mid+1;i=end;i+) for(int i=mid+1;i=end;i+) for(int j=m;jn;j+) for(int j=m;jn;j+) aij = ai-mj-m; aij = ai-mj-m; for(int i=start;i=mid;i+) for(int i=start;i=mid;i+) for(int j=m;jn;j+) for(int j=m;jn;j+) aij = ai+mj-m; aij = ai+mj-m; 选选手手第第一一天天第第二二天天第第三三天天第第四四天天第第五五天天第第六六天天第第七七天天1234567821436587341276564321876556781234658721437856241287654321图示图示隐藏隐藏8/92024/7/21 程序实现程序实现9/9