赛程安排问题
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
相关文章推荐