您的位置:首页 > 其它

赛程安排问题

2013-06-13 21:28 246 查看
乒乓球比赛赛程安排
某学校举行乒乓球比赛,在初赛阶段设置为循环赛,设有n位选手参赛,
初赛共进行n-1天, 每位选手要与其他每一们选手进行一场比赛,
然后按积分排名选拔进入决赛的选手。根据学校作息时间, 要求每位
选手每天必须比赛一场,不能轮空。按些要求为比赛安排具体日程,
即决定每天各选手对阵的对手。
import java.util.*;
public class 赛程安排 {

/**
* @param args
*/
public static final int MAXN = 64;
public static int[][] a = new int[MAXN+1][MAXN+1];
// 输入参赛选手人数必须为2的整数次幂,且不超过64.
private static void check(int m) {
int i = 0;
int j = 2;
for(i=2;i<7;i++){
j = j * 2;
if(j==m) break;
}
if(i>=7){
System.out.println("参赛选手人数必须为2的整数次幂,且不超过64.");
System.exit(1);
}
}
//从编号 k 开始的 n 个选手的日程
public static void gamecal(int k,int n){
if(n==2){
a[k][1] = k;    // 参赛选手编号
a[k][2] = k+1;  // 对阵选手编号
a[k+1][1] = k+1;// 参赛选手编号
a[k+1][2] = k;  // 对阵选手编号
}else{
gamecal(k,n/2);
gamecal(k+n/2,n/2);
for(int i=k; i<k+n/2; i++){  // 填充右上角
for(int j=n/2+1; j<=n; j++){
a[i][j] = a[i+n/2][j-n/2];
}
}
for(int i=k+n/2; i<k+n; i++){    // 填充右下角
for(int j=n/2+1; j<=n; j++){
a[i][j] = a[i-n/2][j-n/2];
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub

Scanner scan = new Scanner(System.in);
int m = 0;
System.out.print("输入人数:");
m = scan.nextInt();
check(m);
gamecal(1,m);
System.out.print("编号\t");
for(int i=2; i<=m; i++){
System.out.print((i-1)+"天\t");
}
System.out.println();
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
}

}
运行结果
输入人数:16
编号	1天	2天	3天	4天	5天	6天	7天	8天	9天	10天	11天	12天	13天	14天	15天
1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16
2	1	4	3	6	5	8	7	10	9	12	11	14	13	16	15
3	4	1	2	7	8	5	6	11	12	9	10	15	16	13	14
4	3	2	1	8	7	6	5	12	11	10	9	16	15	14	13
5	6	7	8	1	2	3	4	13	14	15	16	9	10	11	12
6	5	8	7	2	1	4	3	14	13	16	15	10	9	12	11
7	8	5	6	3	4	1	2	15	16	13	14	11	12	9	10
8	7	6	5	4	3	2	1	16	15	14	13	12	11	10	9
9	10	11	12	13	14	15	16	1	2	3	4	5	6	7	8
10	9	12	11	14	13	16	15	2	1	4	3	6	5	8	7
11	12	9	10	15	16	13	14	3	4	1	2	7	8	5	6
12	11	10	9	16	15	14	13	4	3	2	1	8	7	6	5
13	14	15	16	9	10	11	12	5	6	7	8	1	2	3	4
14	13	16	15	10	9	12	11	6	5	8	7	2	1	4	3
15	16	13	14	11	12	9	10	7	8	5	6	3	4	1	2
16	15	14	13	12	11	10	9	8	7	6	5	4	3	2	1

输入人数:8
编号	1天	2天	3天	4天	5天	6天	7天
1	2	3	4	5	6	7	8
2	1	4	3	6	5	8	7
3	4	1	2	7	8	5	6
4	3	2	1	8	7	6	5
5	6	7	8	1	2	3	4
6	5	8	7	2	1	4	3
7	8	5	6	3	4	1	2
8	7	6	5	4	3	2	1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: