关于循环赛日程表算法的研究
循环赛日程表最近研究了一晚上,咋一看不晓得怎么做,其实深入去看就那么回事,主要用了分治法的思想。
思路:对于任意的选手,将其分成两队,求出每一对(n/2-1)天的日程,然后求出所有的比赛日程,在将n/2的队进行拆分,如此进行分治下去,最后合并,最后得到总的日程表
分治合并方式操作:构建一个n*(n-1)的矩阵,然后将矩阵分成四小块,如果求出了每一小块的数值,那么将左上角的矩阵复制到右下角的位置,将左下角的矩阵复制到左上角的位置,就得到日程表,同理,对分出的一小块在进行分治....如此进行下去
Java实现:import java.util.Scanner;
public class CompetitionArrange {
private int a[][];
private int k;
public CompetitionArrange(){
a=new int[257][257];
System.out.println("Please input the number:");
Scanner scanner=new Scanner(System.in);
k=scanner.nextInt();
}
void claculate(){
int n=1;
for(int i=1;i<=k;i++){
n*=2;
}
for(int i=1;i<=n;i++){
a[i][1]=i;
}
for(int p=2;p<=n;){
for(int m=1;m<=n;){
for(int i=m;i<m+p/2;i++){
for(int j=1;j<=p/2;j++){
a[i+p/2][j+p/2]=a[i][j];
a[i][j+p/2]=a[i+p/2][j];
}
}
m+=p;
}
p*=2;
}
}
void output(){
int n;
for(n=1;n<=256;n++){
if(a[1][n]==0){
break;
}
}
n--;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
System.out.print(" "+a[i][j]);
}
System.out.println("");
}
}
public static void main(String [] args){
CompetitionArrange competitionArrange=new CompetitionArrange();
competitionArrange.claculate();
competitionArrange.output();
}
}