分治法循环赛日程表实验报告.docVIP

  • 233
  • 0
  • 约6.26千字
  • 约 11页
  • 2017-10-01 发布于重庆
  • 举报
分治法循环赛日程表实验报告

西北农林科技大学信息工程学院 《算法分析与设计》综合训练实习报告 题 目:分治法循环赛日程表 学 号 姓 名 专业班级 指导教师 实践日期 2011年5月16日-5月20日 目 录 一、综合训练目的与要求 1 二、综合训练任务描述 1 三、算法设计 1 四、详细设计及说明 3 五、调试与测试 4 六、实习日志 5 七、实习总结 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个选手的比赛日程,只要知道其中一半的比赛日程,所以使用递归最终可以分到计算两位选手的比赛日程,然后逐级合并,得出结果。 (2) 框图 (3) 伪代码 static int a[][] = new int[100][100]; static int athletes; static int n; static void copy(int 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 tournament(int n) // 分治算法,递归调用自己 { if (n == 1) { a[1][1] = 1; return; } tournament(n / 2); // 分治 copy(n); // 合并 } public static void main(String[] args) { n=getText(); athletes = n; tournament(n); } } 四、详细设计及说明 (1)输入一个数字n,根据(x(x-1))==0a[1][1] = 1之后,开始逐级合并,n=n*2,m=n/2,由a[i][j + m] = a[i][j] + m得出a[1][2],由a[i + m][j] = a[i][j + m]得出a[2][1],由a[i + m][j + m] = a[i][j]得出a[2][2],如下所示: 1 2 2 1 表1 (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],(即把左上角数的值赋给对应的右下角数) 如下图: 表2 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 (5)继续照这样递归,直到算出a[i][j]所有的值 五、调试与测试 测试结果: 图2 输入不是2的阶次方的数 图3 输入数16的结果 六、实习日志 5月16日 理解题意,题目要求,确定使用分治法解决 5月17日

文档评论(0)

1亿VIP精品文档

相关文档