您的位置:首页 > 其它

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

2014-09-26 01:35 190 查看
                                                  关于循环赛日程表算法的研究

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


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

      }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法