28循环赛日程表
一设计题目
循环赛日程表
二设计说明 设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)循环赛一共进行n-1天。
设计要求:请使用C语言编程,设计一个有效的算法解决循环赛日程表问题。
三系统功能分析
1、系统用到的数据类型
程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。在循环赛日程表程序设计中,选手与日期可能太多有时可能太少,所以采用把所有选手分成两组,n个选手分为n/2个选手来设计比赛日程表来决定。
2.主要算法如下:
void Table(double k, int **a)
{int i, j, s, t, n = pow(2, k);
for (i = 1; i
int m = 1;
for (s = 1; s
{n /= 2;
for (t = 1; t
for (i = m + 1; i
for (j = m + 1; j
{a[i][j+(t-1)*m*2] = a[i-m][j+(t-1)*m*2-m];
a[i][j+(t-1)*m*2-m] = a[i-m][j+(t-1)*m*2];
}
m *= 2;
}
}
2.main()函数
此程序是有主函数与Table(k,a)函数组成的,以主函数为程序入口,通过主函数来控制和调用Table(k,a)函数。控制功能的实现是利用指针数组与循环来实现的。
3.scanf()函数
直接从键盘上输入选手人数与赛程日期到&n和&r中,并在屏幕中显示。
4.printf()函数
直接输出比赛人数于比赛日期,并在屏幕上显示“请输入比赛人数”与“请输入比赛日期”。
四源程序代码
#include "stdio.h"
#include
void Table(double k, int **a) {
int i, j, s, t, n = pow(2, k);
for (i = 1; i
int m = 1;
for (s = 1; s
n /= 2;
for (t = 1; t
for (i = m + 1; i
for (j = m + 1; j
a[i][j+(t-1)*m*2] = a[i-m][j+(t-1)*m*2-m];
a[i][j+(t-1)*m*2-m] = a[i-m][j+(t-1)*m*2];
}
m *= 2;
}
}
print(int **a, int n) {
for(int i = 1; i
printf (" %d ",a[i][j]); printf("\n");
}
}
void main() {
printf(" 请输入选手人数: n = "); int n;
int r;
scanf("%d",&n);
printf(" 请输入比赛日期: r = "); scanf("%d",&r);
int **a = new int*[n+1]; for (int i = 0; i
int k = log10(n)/log10(2); printf("\n比赛日程表:\n"); int *b;
b=new int[n+1];
b[0]=0;
printf(" ");
for(int l=1;l
{ b[l]=r++;
printf(" %d日",b[l]);} printf("\n");
Table(k, a);
print(a, n);
}
五运行结果