关于循环赛日程表算法的研究
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();
}
}
循环赛日程表最近研究了一晚上,咋一看不晓得怎么做,其实深入去看就那么回事,主要用了分治法的思想。
思路:对于任意的选手,将其分成两队,求出每一对(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();
}
}
相关文章推荐
- 【转】单循环赛赛程安排算法研究
- 循环赛日程表算法
- [置顶] 关于《连连看》的算法研究和演示Demo
- 算法分析与设计-04-循环赛日程表算法
- 算法之循环赛日程表
- [算法之分治法应用] 循环赛日程表
- 关于对LIR系统中不规则表格的整理算法研究
- java中关于爬楼梯算法的研究
- DOTA2比赛赛前预测算法的研究(二)--关于数据存储,mongoDB的使用
- 关于oc中遍历的效率算法研究
- 关于二维码分块上色(彩色二维码)的算法研究
- [算法]循环赛日程表
- 算法分析思维分析,以循环赛日程表为例
- 关于树分块算法的一些研究
- 关于智能寻路算法的研究,A-Star算法拓展,B星寻路算法
- 关于MRu算法的实现研究
- 关于 多元一次方程 算法的 研究过程
- 循环赛日程表算法
- 循环赛日程表(计算机算法设计与分析 --王晓东) 2.11
- 关于GC常用算法的研究