/*【程序8】
* 作者 中国风
* 乒乓球比赛赛程安排
* 某学校举行乒乓球比赛,在初赛阶段设置为循环赛,设有n位选手参赛,
* 初赛共进行n-1天, 每位选手要与其他每一们选手进行一场比赛,
* 然后按积分排名选拔进入决赛的选手。根据学校作息时间, 要求每位
* 选手每天必须比赛一场,不能轮空。按些要求为比赛安排具体日程,
* 即决定每天各选手对阵的对手。
*/
import java.util.Scanner;
public class T008 {
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<8;i++){
j = j * 2;
if(j==m) break;
}
if(i>=8){
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){
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();
}
}
}
运行结果: