分治法,循环赛日程表

来源:互联网 发布:linux怎么运行sh脚本 编辑:程序博客网 时间:2024/03/28 21:52
#include<stdio.h>
#define N 64
void GameTable(int k,int a[][N])
{
//n=2^k(k>=1)个选手参加比赛,二维数组a表示日程安排,数组下标从1开始
int n=2;//k=0,两个选手比赛日程可直接求得
//求解两个选手比赛日程,得到左上角元素
a[1][1]=1;a[1][2]=2;
a[2][1]=2;a[2][2]=1;
int i,j,t;
for(t=1;t<k;t++)//迭代处理,依次处理2^2,....,2^k个选手比赛日程
{
     int temp=n;n=n*2;
     //填左下角元素
    for(i=temp+1;i<=n;i++)
         for(j=1;j<=temp;j++)
             a[i][j]=a[i-temp][j]+temp;//左下角元素和左上角元素的对应关系
         //将左下角元素抄到右上角
         for(i=1;i<=temp;i++)
             for(j=temp+1;j<=n;j++)
                 a[i][j]=a[i+temp][(j+temp)%n];
             //将左上角元素抄到右下角
             for(i=temp+1;i<=n;i++)
                 for(j=temp+1;j<=n;j++)
                     a[i][j]=a[i-temp][j-temp];
                
                
}
for(i=1;i<=n;i++)//显示日程表
     for(j=1;j<=n;j++)
     {
         printf("-%d",a[i][j]);
         if(j==n)
             printf("\n");
     }
}
int main()
{
int a[N][N];
int k;
printf("输入选手的个数:(注意为2的平方)");
scanf("%d",&k);
GameTable(k,a);
}
1 0
原创粉丝点击