循环赛日程表实验报告 下载本文

天津工程师范学院

《算法与程序计》

--课程设计报告

班级:计科0813班 学号:02210081302 姓名: 1

天津工程师范学院

设计时间:2009.12.21—12.25 一.课程设计名称:

循环赛日程表

二.实验内容 问题描述:

设有n位选手参加网球循环赛,n=2^k,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天比赛一场,不能轮空,按一下要求为比赛安排日程, (1) 每位选手必须与其他n-1格选手格赛一场; (2) 每个选手每天只能赛一场; (3) 循环赛一共进行n-1天;

请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行和第j列处填入第i个选手在第j天所遇到的选手,其中1≤i≤n,1≤j≤n-1。 三.实验目的

1.运用分治法,设计解决上述问题的算法,设计出比赛日程表,在表中的第i行和第j列处填入第i个选手在第j天所遇到的选手(其中1≤i≤n,1≤j≤n-1)。 2.掌握分治算法的应用。 四.算法原理

运用分治法,将原问题划分为较小问题,然后由较小问题的解得出原问题的解。

天津工程师范学院 2

1.分治法:对于一个规模为n的问题,若该问题可以容易的解决(比如说规模n较小),则直接解决,否则将其分解为k个规模较小的子问题,这些子问题相互独立且与原问题形式相同,递归的解决这些子问题,然后将个子问题的解合并,得到原问题的解。 2.分治法的解题步骤(由三个步骤组成)

? 划分(divide):将原问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。

? 解决(conquer):若子问题规模较小,则直接求解;否则递归求解各子问题。

? 合并(conbine):将各子问题的解合并为原问题的解 五.问题分析

假设n位选手顺序编号为1,2,3……n,比赛的日程表是一个n行n-1列的表格。i行j列的表格内容是第i号选手在第j天的比赛对手。

根据分而治之的原则,可从其中以半选手的比赛日程,导出全体n位选手的的日程,最终细分到只有两位选手的比赛日程出发。 六.设计步骤

1.先设计主函数(main函数),然后设计两个函数,分别是安排赛事进行填制表格的函数(void arrangement(int n,int N,int k,int a[100][100])函数)和输出到屏幕函数(void print(int n,int a[100][100]))。

天津工程师范学院 3

2.在主函数(main())里调用void arrangement()函数,对比赛日程进行安排,根据分而治之原则,绘制比赛日程表格,然后调用void print()函数,将安排好的比赛日程输出到屏幕上。 七.关键数据结构

1.运用一个二维数组a[i][j],对安排好的赛事日程进行排列和保存,并在屏幕上输出。

2.使用二维数组的原因:因为根据题目要求,比赛日程表是一个n行n-1列的表格,用a[i][j]代表第i号选手在第j天遇到的对手,所以用一个二维数组表示。 八.程序结构

程序主要由三个函数组成: (1)main()函数(主函数),

(2)void arrangement()函数(本程序的核心函数), (3)print函数(输出函数)

1.main()函数

天津工程师范学院

4