- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
XX学院
计算机科学与技术系
课程设计报告
2008 ~2009 学年第 2 学期
课程 数据结构与算法 课程设计名称 单循环赛中选手胜负序列求解问题 学生姓名 学号 专业班级 指导教师
2009 年 2 月
题目:单循环赛中选手胜负序列求解问题
问题分析和任务定义
单循环赛:
单循环赛,是所有参加比赛的队均能相遇一次,最后按各队在全部比赛中的积分、得失分率排列名次。如果参赛球队不多,而且时间和场地都有保证,通常都采用这种竞赛方法。 单循环比赛轮次的计算
按比赛过程中各个选手间的胜负关系产生胜负序列:
该种方法是以过程中的胜负为标准从而产生胜负序列,当然,这种胜负序列很大的可能性是不唯一的,本程序按课程设计任务书的要求,仅求出其中的一个胜负序列关系。
数据结构的选择和概要设计
(1)对于第一种情况,本实验选用的数据结构是类。将选手的编号、积分、以及胜负处理等等封装在类中。胜负序列的求解转化为了对所有选手的积分的排序问题。
(2)对于第二种情况,本实验采用的数据结构是有向图,每个选手视为一个点,每条边视为选手之间的胜负关系,箭头指向的一方为失败方。所以胜负序列的求解就转化为了图的深度遍历问题。为了便于深度遍历有向图,采用的存储结构为图的临街矩阵存储。
详细设计和编码
(1)就第一种情况而言,较为简单,设计一个选手类Player,私有成员包括分数score和选手编号num。公有成员包括构造函数Player(),设置编号void setnum(int num1),获胜处理函数void win(),失败处理函数void fail(),返回编号函数int getnum(),返回积分函数int getscore()。类的定义如下:
class player//选手类
{
private:
int score;//积分
int num;//参赛编号
public:
player()
{}
void setnum(int num1)//设置编号
{
num = num1;
score = 0;
}
void win()//胜利
{
score ++;
}
void fail()//失败
{
score --;
}
int getscore()//获取分数
{
return score;
}
int getnum()//获取编号
{
return num;
}
};
这些代码定义为头文件 score.h
在程序的初始化时根据输入的选手数量n,动态申请一个选手类的数组Player[n]。依次输入第一个选手和后面的n-1个选手的胜负关系,第二个选手和后面n-2个选手的胜负关系……第n-1个选手和第n个选手的胜负关系。W(w)表示胜利,F(f)表示失败。
在选手的胜负关系输入完毕后通过getscore()返回各个选手的积分对各个选手的积分进行排序,从而得到选手的胜负序列关系。
(2)就第二种情况而言,较为复杂,使用的图,即将比赛过程中的各个选手间的胜负关系转化为一个有向图且是连同的完全有向图。
模型表示 :由于仅涉及到 n 个选手,并且这些选手之间的关系仅是胜负关系,因此可用图来表示,用顶点表示选手, 用弧表示选手之间的胜负关系:当且仅当 P i 胜 P j 时,有从顶点 i 到 j 的一条弧。
在这种表示下,本题问题变成了如下的问题:
在有向图中求解出一条包含所有顶点的简单路径的问题。
下图所示为一个有 8 个选手的问题的一个示例。其中的一个解为 1,2,3,4,8,6,5,7 。
算法设计 :设计本题算法的构思如下:
为搜索出符合条件的简单路径,需按深度优先搜索方式进行遍历。因此求解算法应 是深度遍历算法的变形形式 ,也应是递归形式的算法。
由于要求遍历序列中的各结点按次序构成一条简单路径,因此算法与深度遍历算法有明显的不同:并非任意选择的起点和访问次序都能得到解。而这些又是事先难以确定的。这就要求在求解过程中进行试探: 试探起点以及访问次序 。
既然要在求解过程中进行试探,则 需要记录试探的中间状态 :某顶点是否在当前试探的路径中,已经试探的各顶点的次序,当前正在试探的顶点等。将所用到的变量及有关参数设置如下:
设置MAX_POINT_NUM 100为最大选手数量。路径结构WAY,包含路径上选手在序列数组中的小标k和选手序列way[MAX_POINT_NUM],都是整型。设置结构体Graph为图的存储结构,包含选手的人数n和存储矩阵edges[MAX_POINT_NUM][MAX_POINT_NUM],为邻接存储矩阵,即本程序采用临街矩阵作为图的存储
文档评论(0)