(完整word版)分治法循环赛日程表实验报告.docVIP

(完整word版)分治法循环赛日程表实验报告.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
西北农林科技大学信息工程学院 《算法分析与设计》综合训练实习报告 题目:分治法循环赛日程表 专业班级 指导教师 一、 综合训练目的与要求 1 二、 综合训练任务描述 1 三、 算法设计 1 四、 详细设计及说明 3 五、 调试与测试 4 六、 实习日志 6 七、 实习总结 6 八、 附录:核心代码清单 6 、综合训练目的与要求 本综合训练是软件工程专业重要的实践性环节之一,是在学生学习完《算法分析》 课程后进行的综合练习。本课综合训练的目的和任务: (1) 巩固和加深学生对算法分析课程基本知识的理解和掌握; (2) 培养利用算法知识解决实际问题的能力; (3) 掌握利用程序设计语言进行算法程序的开发、调试、测试的能力; (4) 掌握书写算法设计说明文档的能力; (5) 提高综合运用算法、程序设计语言、数据结构知识的能力。 二、 综合训练任务描述 假设有n=2k个运动员要进行网球循环赛。设计一个满足一下要求的比赛日程表: (1) 每个选手必须与其他n-1个选手各赛一次 (2) 每个选手一天只能赛一次 (3) 循环赛一共进行n-1天 利用Java语言开发一个界面,输入运动员的个数,输出比赛日程表。对于输入运 动员数目不满足n=2k时,弹出信息提示用户。 三、 算法设计 (1)文字描述 假设n位选手顺序编号为1, 2, 3……n,比赛的日程表是一个n行n-1列的表格。 第i行j列表示第i号选手在第j天的比赛对手,根据分治法,要求n个选手的比赛日 程,只要知道其中一半的比赛日程,所以使用递归最终可以分到计算两位选手的比赛日 程,然后逐级合并,得出结果。 ⑵框图 图1 (3)伪代码 static int a[][] = new in t[100][100]; static int athletes; static int n; static void copy(i nt n) {// 核心代码 int m = n / 2; for (int i = 1; i = m; i++) for (int j = 1; j = m; j++) { a[i][j + m] = a[i][j] + m;// a[i + m][j] = a[i][j + m];// a[i + m][j + m] = a[i][j];// } } static void tourname nt(i nt n) // 分治算法,递归调用自己 { if (n == 1) { a[1][1] = 1; return; } tourname nt(n / 2); // 分治 copy(n); // 合并 } public static void main( Stri ng[] args) { n=getText(); athletes = n; tourn ame nt(n); } } 四、详细设计及说明 (1) 输入一个数字n,根据(x (x-1))==0判断n是否等于2Ak。 出错,要求重新输入 (2) 按照分治的策略,将所有参赛的选手分为两部分,tournament(int 递归调用自身,直到n=1. (3) n=1得出a[1][1] = 1 之后,开始逐级合并,n=n*2,m=n/2,由 =a[i][j] + m 得出 a[1][2],由 a[i + m][j] = a[i][j + m] 得出 a[2][1] m][j + m] = a[i][j] 得出 a[2][2],如下所示: 表1 匚 三 tz 丄 (4)继续n=n*2, m=n/2,可以仍把它看做均分的四个区域, 仍然按照右上,左下, 右下的顺序计算。 由 a[1][1]得出 a[1][3],由 a[1][2]得出 a[1][4],由 a[2][1]得出 a[2][3],由 a[2][2]得出a[2][4],(即由左上角数的值算出对应的右上角数) 由 a[1][3]得出 a[3][1],由 a[1][4]得出 a[3][2],由 a[2][3]得出 a[4][1],由 a[2][4]得出a[4][2],(即把右上角数的值赋给对应的左下角数) 由 a[1][1]得出 a[3][3],由 a[1][2]得出 a[3][4],由 a[2][1]得出 a[4][3],由 a[2][2]得出a[4][4],(即把左上角数的值赋给对应的右下角数) 如下图: (5)继续照这样递归,直到算出a[i][j] 所有的值 五、调试与测试 测试结果: 图2输入不是2的阶次方的数 图3输入数16的结果 六、 实习日志 5月16日 理解题意,题目要求,确定使用分治法解决 5月17日 根据书上分治法的设计思路以及所提供的代码按题目要求设计算法, 并根据算法写 出核心代码,在C++上实现。 5月18日 在JAVA上实现除

文档评论(0)

wangxing1张 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档