算法程序设计 之 循环赛日程表(2/8)

一、实验目的:

理解并掌握分治算法的基本思想和设计步骤。

二、实验内容

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

(1)每个选手必须与其他n-1个选手各赛一次;

(2)每个选手一天只能赛一次;

(3)当n是偶数时,循环赛进行n-1天,n为奇数时,循环赛进行n天。

程序代码:

#include<stdio.h>

int a[50][50],i,j;

int ji_shu(int n)  

{

if(n%2==1)

return 1; 

else return 0;

}

int copy_o(int n)

{

int m=n/2;

for(i=1;i<=m;i++)

for(j=1;j<=m;j++)

       { a[i][j+m]=a[i][j]+m;

         a[i+m][j]=a[i][j+m];

         a[i+m][j+m]=a[i][j];

}

}

void copy_j (int n)

    { int m=n/2;

      for(i=1;i<=m;i++)

    {for( j=1;j<=m+1;j++)

            {if(a[i][j]>m)

           {a[i][j]=i+m;//(m+i)填第一组的空

           a[m+i][j]=i;}//填第二组的空 m+i-m

            else  a[m+i][j]=a[i][j]+m;

           }

          

 for(j=m+2;j<=n;j++)

         {if(i+j-1>n)

        { a[i][j]=j+i-1-m;}

        else{a[i][j]=j+i-1;}

        

 if(m+i<j){a[m+i][j]=n+i+1-j;

}

 else {a[m+i][j]=m+1+i-j; }//a[m+1+i][j]=m+1+i-j+1;

        }

 }

}

void  pan_duan(int n)

    {  if(n/2>1&&ji_shu(n/2)) copy_j(n);

       else copy_o(n);

    }

void fen_zhi (int n){

if(n==1) {a[1][1]=1;return;}

if (ji_shu(n)) {fen_zhi(n+1);return;}

      fen_zhi(n/2);

      pan_duan(n);

}

int main()

{

    int n=0;

    printf ( "请输入参赛人数:" );

    scanf("%d",&n);

    fen_zhi(n);

    printf ( "得到的循坏赛日程表为:\n" );

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

    for(j=1;j<=n+1;j++)

{

if(a[i][j]>n)a[i][j]=0;}

     if(ji_shu(n))

{  

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

    {for(j=1;j<=n+1;j++)

    printf (" %2d ",a[i][j]);

    printf("\n");}}

else{for(i=1;i<=n;i++)

    {for(j=1;j<=n;j++)

    printf ( " %2d " ,a[i][j]);

    printf("\n");}}

}

程序测试及运行结果:

(1)输入n/2为偶数的数

(2)输入n/2为奇数的数

(3).输入n为奇数

本文链接:https://my.lmcjl.com/post/2664.html

展开阅读全文

4 评论

留下您的评论.