循环赛日程表

问题描述:
设有n(n = 2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空。试按此要求为比赛安排日程:
 (1) 每个选手必须与其他n-1个选手各赛一场;
 (2) 每个选手一天只能赛一场;
 (3) 循环赛一共进行n-1天。
 
 

选手

第一天

第二天

第三天

第四天

第五天

第六天

第七天

1

2

3

4

5

6

7

8

2

1

4

3

6

5

8

7

3

4

1

2

7

8

5

6

4

3

2

1

8

7

6

5

5

6

7

8

1

2

3

4

6

5

8

7

2

1

4

3

7

8

5

6

3

4

1

2

8

7

6

5

4

3

2

1

 
 

#include<stdio.h>

const int N=8;
int mat[N][N];

void print(int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            printf("%4d",mat[i][j]);
        printf("\n");
    }
    printf("***********************************\n");
}

void evaluate(int n)                                    
{
    int m=n/2;
    for(int i=0;i<m;i++)
        for(int j=0;j<m;j++)
        {
            mat[i+m][j]=mat[i][j]+m;                    
            mat[i][j+m]=mat[i+m][j];                    
            mat[i+m][j+m]=mat[i][j];                    
        }
    print(N);
}

void solve(int n)
{
    if(n==1)
    {
        mat[0][0]=1;
        return;
    }

    solve(n/2);
    evaluate(n);
}

int main()
{
    
    solve(N);
    //print(N);


    return 0;
}

 

算法思路:

将正方形等分成四个子正方形,左上方的子正方形可以容易地画出,左下方的子正方形与左上方的子正方形性质一样(可认为两者相互独立),但为了区别选手,就可以只在左上方的子正方形的每个选手编号加上固定的偏移量m得到左下方的子正方形,然后在正方形的右边放置颠倒的正方形的左边,即右上方、右下方的子正方形分别放置左下方、左上方的子正方形,这样放置恰好满足题目要求。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值