【问题描述】
设有2n2n (n≤6)(n≤6)个球队进行单循环比赛,计划在2n−12n−1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2n−12n−1天内每个队都与不同的对手比赛。
【输入】
输入共一行,输入nn的数值。
【输出】
输出共2n−12n−1行,第ii行输出第ii天的比赛安排。
格式为:<ii>A-B C-D ……。其中ii是天数,A,B分别为比赛双方的编号,每行共2n−12n−1个比赛场次。
【输入样例】
2
【输出样例】
<1>1-2 3-4
<2>1-3 2-4
<3>1-4 2-3
【数据规模和约定】
1≤n≤4
==============================================
代码:
import java.util.Scanner;
public class Main{
//初始化
public static void Itint(int m,int n[]) {
for (int i = 0; i < m; i++) {
n[i] = 0;
}
}
//返回没有进行比赛的编号
public static int DoSome(int m,int n[],int k) {
for (int i = k; i < m; i++) {
if(n[i] == 0) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
double a = scan.nextDouble();
int m = (int)Math.pow(2.0, a);
int [][]s = new int[m][m];
int n[] = new int [m];
for (int i = 0; i < s.length; i++) {
for (int j = 0;j < s[i].length; j++) {
if(i == j) {
s[i][j] = 1;
}
else {
s[i][j] = 0;
}
}
}
//2^n-1 行
for (int i = 0; i < s.length-1; i++) {
Itint(m, n);
System.out.print("<"+(i+1)+">1-"+(i+2));
s[0][i+1] = 1;
s[i+1][0] = 1;
n[0] = n[i+1] = 1;
//每一行的循环
for (int j = 0; j < s[i].length; j++) {
int f1 = DoSome(m, n, 0);
if(f1 > -1) {
int f2 = DoSome(m, n, 0);
while(s[f1][f2] == 1) {
f2 = DoSome(m, n, f2+1);
}
n[f1] = n[f2] = 1;
System.out.print(" "+(f1+1)+"-");
System.out.print(f2+1);
s[f1][f2] = 1;
s[f2][f1] = 1;
}
else {
break;
}
}
System.out.println();
}
}
}