关于循环赛日程表算法的研究

来源:互联网 发布:开源微信商城系统php 编辑:程序博客网 时间:2024/05/24 04:54

                                                  关于循环赛日程表算法的研究

      循环赛日程表最近研究了一晚上,咋一看不晓得怎么做,其实深入去看就那么回事,主要用了分治法的思想。

       思路:对于任意的选手,将其分成两队,求出每一对(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();
      }


}

0 0
原创粉丝点击