17人参加单小组循环赛对阵表对阵表

乒乓球循环赛对阵表_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
乒乓球循环赛对阵表
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢3367人阅读
数据结构和算法(16)
首先,来解释一下,什么是单循环问题,其实,这是一个我们在实现中经常遇到的问题。
问题描述:
赛程问题:有N个运动员进行单循环赛,即两个运动员都要与其他所有运动员比赛一次。要求每个运动员每天只进行一次比赛,且整个赛程在N-1天内结束,运动员编号由1到N
注:N = 2^k
解题思想:
看到这个问题,我们的第一种想法当然就是用穷举法,找出一个可行的方案。其实这题并不适合用穷举法去解决,因为其时间复杂度太大。下面来说说,如何使用分治的思想来解决这个问题。
按分治策略,我们可以将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,就让这两个选手进行比赛就可以了。
日程表可用矩阵来标识,元素值为运动员编号,列坐标表示第几天,下标从0开始,并约定第0天,表示自己跟自己比赛,例如,对于只有两个动员员的情况
表示,1的第1天跟2比赛,2的第一天跟1比赛。
下面来看看四个运动员的情况,如下:
可把它划分为4个2*2的矩阵,即划分为四组两个动动员时的情况。
据此我们可以看到,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了。
下面我们来看看如何用代码(C/C++)实现它。
代码实现:
#include &iostream&
void GameSchedule(int *table, int table_rank);
//单循环赛程算法启动函数
void GSchedule(int *table, int table_rank,
int r1, int c1, int r2, int c2, int n);
//单循环赛程的安排实现
void InitTable(int *table, int table_rank);
//初始化赛程表
void PrintTable(int *table, int table_rank);
//输出赛程表
int main()
int sport_count = 0;//记录运动员的人数
cout&&&Please enter the count of sporters: &;
cin&&sport_
//创建一张运动员人数*运动员人数的赛程表
int *table = new int[sport_count * sport_count];
//安排赛程
GameSchedule(table, sport_count);
//输出安排结果
PrintTable(table, sport_count);
void GameSchedule(int *table, int table_rank)
//首先对赛程表初始化,然后进行赛程安排
InitTable(table, table_rank);
GSchedule(table, table_rank,
0, 0, table_rank-1, table_rank-1, table_rank);
void GSchedule(int *table, int table_rank,
int r1, int c1, int r2, int c2, int n)
//table_rank为矩阵的阶数,n为运动员的人数
//(r1,c1)为要处理的子矩阵的第一个元素的坐标
//(r2,c2)为要处理的子矩阵的最后一个元素的坐标
if(n &= 2)
//对以坐标(r1,c1)为始点,(r2,c2)为终点的所有的运动员安排赛程
for(int i = 0; i & ++i)
//即将左上角小块中的所有数字按其相对位置抄到右下角
//将左下角小块中的所有数字按其相对位置抄到右上角
if(*(table + (r2-i)*table_rank+c2) == 0)
*(table + (r2-i)*table_rank+c2)
= *(table+(r1+i)*table_rank+c1);
*(table+(r1+i)*table_rank+c1)
= *(table+(r2-i)*table_rank+c2);
int mr = (r2-r1)/2;
int mc = (c2-c1)/2;
n /= 2;//将运动员的人数减少一半
//为其左上角的四分之一的矩阵安排赛程
GSchedule(table, table_rank, r1,c1, r1+mr,c1+mc, n);
//为其右上角的四分之一的矩阵安排赛程
GSchedule(table, table_rank, r1, c1+mc+1, r1+mr, c2, n);
//为其左下角的四分之一的矩阵安排赛程
GSchedule(table, table_rank, r1+mr+1, c1, r2, c1+mc, n);
//为其右下角的四分之一的矩阵安排赛程
GSchedule(table, table_rank, r1+mr+1, c1+mc+1, r2, c2, n);
void InitTable(int *table, int table_rank)
//初始化赛程表,首先把所有的数据置0
for(int i = 0; i & table_ ++i)
for(int j = 0; j & table_ ++j)
*(table + i * table_rank +j) = 0;
//设置第0天为与自己比赛
for(int i = 0; i & table_ ++i)
*(table+i*table_rank+0) = i + 1;
void PrintTable(int *table, int table_rank)
//输出赛程表
for(int i = 0; i & table_ ++i)
for(int j = 0; j & table_ ++j)
cout && *(table+i*table_rank+j) &&' ';
算法分析:
我们可以通过使用一个二维数组来记录矩阵,虽然这里你看到的一个一维的数组,这是因为运动员的人数是通过输入来确定的,所以必须使用动态内存分配,也就不能事先确定数组的第二维(即列数)的大小,所以只好使用一个一维数组当二维数组使用。然后使用变量table_rank来确定赛程表的阶数(也可理解为一行有多少列,或运动员的人数)。表达式table+i*table_rank+j用于找出第i行第j列的元素的地址,所以*(table+i*table_rank+j)就相当于平时大家熟悉的table[i][j]。
如果事先已经确定了人数,也可以不使用动态内存分配,而使用全局变量来实现,则函数GSchedule可少用前面的两个参数。
代码下载地址:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1454745次
积分:10407
积分:10407
排名:第1248名
原创:126篇
转载:35篇
评论:694条
阅读:14526
文章:28篇
阅读:943362
(1)(2)(5)(2)(1)(1)(1)(2)(2)(4)(2)(1)(7)(5)(4)(3)(15)(17)(4)(4)(4)(3)(2)(11)(5)(10)(10)(11)(24)14支球队单循环赛程表_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
14支球队单循环赛程表
上传于||文档简介
&&足球等赛事 14支球队单循环赛程表
阅读已结束,如果下载本文需要使用3下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩11页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢大连象棋群10人对阵单循环对阵表及排序规则_大连象棋吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,281贴子:
大连象棋群10人对阵单循环对阵表及排序规则
大连象棋群要搞一个10人单循环赛,受高棋王委托,我负责本次比赛的编排和排序工作。现将比赛编排对阵列出。希望大家按中列出的先后手和对手进行对弈。括号中的数字为中象编号。在开赛之前,请互相全部加为好友,以保证比赛的顺利进行。第 1 回合红方: 永胜 (8970771)
黑方: 南岭弯刀 (5682054)红方: 布局飞力 (6498712)
黑方: 潘利 (4229724)红方: 人机旅程 (3325822)
黑方: 山东路小胖 (8974107)红方: 南关岭棋童 (3724745)
黑方: 逍遥散仙 (8800521)红方: 大连小将军 (1232221)
黑方: 手机象棋 (2397481)第 2 回合红方: 南岭弯刀 (5682054)
黑方: 手机象棋 (2397481)红方: 逍遥散仙 (8800521)
黑方: 大连小将军 (1232221)红方: 山东路小胖 (8974107)
黑方: 南关岭棋童 (3724745)红方: 潘利 (4229724)
黑方: 人机旅程 (3325822)红方: 永胜 (8970771)
黑方: 布局飞力 (6498712)第 3 回合红方: 布局飞力 (6498712)
黑方: 南岭弯刀 (5682054)红方: 人机旅程 (3325822)
黑方: 永胜 (8970771)红方: 南关岭棋童 (3724745)
黑方: 潘利 (4229724)红方: 大连小将军 (1232221)
- 黑方: 山东路小胖 (8974107)红方: 手机象棋 (2397481)
黑方: 逍遥散仙 (8800521)第 4 回合红方: 南岭弯刀 (5682054)
黑方: 逍遥散仙 (8800521)红方: 山东路小胖 (8974107)
黑方: 手机象棋 (2397481)红方: 潘利 (4229724)
黑方: 大连小将军 (1232221)红方: 永胜 (8970771)
黑方:南关岭棋童 (3724745)红方: 布局飞力 (6498712)
黑方: 人机旅程 (3325822)第 5 回合红方: 人机旅程 (3325822)
黑方: 南岭弯刀 (5682054)红方: 南关岭棋童 (3724745)
黑方: 布局飞力 (6498712)红方: 大连小将军 (1232221)-
黑方: 永胜 (8970771)红方: 手机象棋 (2397481)
黑方: 潘利 (4229724)红方: 逍遥散仙 (8800521)
黑方: 山东路小胖 (8974107)第 6 回合红方: 南岭弯刀 (5682054)
黑方: 山东路小胖 (8974107)红方: 潘利 (4229724)
黑方: 逍遥散仙 (8800521)红方: 永胜 (8970771)
黑方: 手机象棋 (2397481)红方: 布局飞力 (6498712)
黑方: 大连小将军 (1232221)红方: 人机旅程 (3325822)
黑方: 南关岭棋童 (3724745)第 7 回合红方: 南关岭棋童 (3724745)
黑方: 南岭弯刀 (5682054)红方: 大连小将军 (1232221)
黑方: 人机旅程 (3325822)红方: 手机象棋 (2397481)
黑方: 布局飞力 (6498712)红方: 逍遥散仙 (8800521)
黑方: 永胜 (8970771)红方: 山东路小胖 (8974107)
黑方: 潘利 (4229724)第 8 回合红方: 南岭弯刀 (5682054)
黑方: 潘利 (4229724)红方: 永胜 (8970771)
-黑方: 山东路小胖 (8974107)红方: 布局飞力 (6498712)
黑方: 逍遥散仙 (8800521)红方: 人机旅程 (3325822)
- 黑方: 手机象棋 (2397481)红方: 南关岭棋童 (3724745)
黑方: 大连小将军 (1232221)第 9 回合红方: 大连小将军 (1232221)
黑方: 南岭弯刀 (5682054)红方: 手机象棋 (2397481)
黑方: 南关岭棋童 (3724745)红方: 逍遥散仙 (8800521)
黑方: 人机旅程 (3325822)红方: 山东路小胖 (8974107)
黑方: 布局飞力 (6498712)红方: 潘利 (4229724)
黑方: 永胜 (8970771)按照2011象棋规则,一盘单循环制的比赛名次比较顺序是:总分、小分、胜局、直胜、后手数、交手时执后。特此通告。
老帖子有些语病问题,...
e5200秒天秒地秒空气!
一年前看了鲁鲁修。今天...
上海张学友、王菲演唱会一站式购票!票品安全且真票!立即订购!
村长威武!神勇!
村长辛苦还有几位赛事举办者都辛苦了!沧海,飞力,永胜
结果请及时发布谢谢
第一轮结束,成绩为红方: 永胜 (8970771)
1:1 黑方: 南岭弯刀 (5682054)红方: 布局飞力 (6498712)
2:0 黑方: 潘利 (4229724)红方: 人机旅程 (3325822)
黑方: 山东路小胖 (8974107)红方: 南关岭棋童 (3724745)
0:2 黑方: 逍遥散仙 (8800521)红方: 大连小将军 (1232221)
0:2 黑方: 手机象棋 (2397481)
办实事的好村长,人民的好干部
贴吧热议榜
使用签名档&&
保存至快速回贴}

我要回帖

更多关于 羽毛球循环赛对阵表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信