循环赛日程表

问题描述 设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:

  1. 每个选手必须与其他n-1个选手各赛一次;
  2. 每个选手一天只能参赛一次;
  3. 循环赛在n-1天内结束。

请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。 参考解答 按分治策略,我们可以将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。   
public
class Heng {

                
void table(
int k,
int a[][])

                 {    

            
int n=1;

            
for(
int i=1;i<=k;i++)

                 n*=2;

            
for(
int i=1;i<=n;i++)

    a[1][i]=i;

            
int m=1;

            
for(
int s=1;s<=k;s++)

                    {

                 n/=2;

                
for(
int t=1;t<=n;t++)

        
for(
int i=m+1;i<=2*m;i++)

                        
for(
int j=m+1;j<=2*m;j++)

            {

             a[i][j+(t-1)*2*m]=a[i-m][j+(t-1)*2*m-m];

             a[i][j+(t-1)*2*m-m]=a[i-m][j+(t-1)*2*m];

                

             }

                        m*=2;

                     }

                    }

    
void printf(
int a[][])

         {

    
for(
int i=1;i<a.length;i++)

     {

     System.out.println();

    
for(
int j=1;j<a[i].length;j++)

     System.out.print(a[i][j]+
” “);

     }

            }

    
public
static
void main(String args[])

     {

        
int b[][]=
new
int [9][9];

        Heng ob=
new Heng();

        ob.table(3,b);

        ob.printf(b);

     }

        

}

点赞