您的位置:首页 > 其它

循环赛日程表算法

2012-03-11 14:56 295 查看
/*
* 设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:
* 每个选手必须与其他n-1个选手各赛一次;
* 每个选手一天只能参赛一次;
* 循环赛在n-1天内结束。
* 数组a[i][j]第i个选手在第j天所遇到的选手。
*/
public class Calendar {
public static void calen(int k, int a[][])
{
// 有n=2^k个人参加比赛
// 定义一个空的二维数组
int n = 1, i, j, s;
for (int m = 1; m <= k; m++)
n = 2 * n;
for (i = 1; i <= n; i++)
a[1][i] = i;
int m = 1;// m用来控制每一次填充数组时的起始位置
// 将这n个人两个两个分为一组,共分为k组,用分治法解决两个人的分配问题,
//然后再解决四个人的问题......
for (s = 1;s <= k; s++) //第一次循环求出两个人的比赛结果,第二次循环求出
{                       //四个人的比赛结果,所以第k次循环求出2^k个人的比赛结果
n/=2;
for(int t=1;t<=n;t++)
{
for(i=m+1;i<=2*m;i++)
{
for(j=m+1;j<=2*m;j++)
{
a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];
a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];
}

}
}
m*=2;
}
}

public static void main(String[] args)
{
int k=3,n=1;
for(int i=1;i<=k;i++)
n*=2;
int a[][]=new int[n+1][n+1];
calen(3,a);
System.out.println(a[7][8]);

}
}


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