循环比赛日程(c++版)

     问题描述:

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

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

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

(3)       循环赛一共进行n-1天。

按此要求可将比赛日程设计成有n行和n-1列的表。在表中的第i行和第j列处填入地i个选手在第j天遇到的选手。

 

算法的思想

  按分治策略,可以将所有选手对分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用这种一份为二的策略对选手进行分割,知道只剩下两个选手时,比赛日程表的制定就变得很简单了。这时只要让这两个选手进行比赛就可以了。

 

具体代码: 

#include <iostream>
#define M 100

using namespace std;

void Table(int k,int **a)
{
 int n=1;
 for(int i=1;i<=k;i++) n*=2;//计算总的比赛次数
 for(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++)//t控制拷贝的次数
   for(int i=m+1;i<=2*m;i++)
    for(int 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;
 }
}

int main()
{
 int k=0;
 int *a[M];
 //动态分配空间,构造二维数组
 for(int q=0;q<M;q++)
  a[q]=new int[M];

 cout<<"请输入运动员的数量:\n";
 cin>>k;
 Table(k,a);     //调用Table函数
     
     for(int i=1;i<=k;i++)    //输出日程表
      {     
          for(int j=1;j<=k;j++)
    {
      if(j==0)
      {
        cout<<a[i][1]<<'\t';
      }
      else
             cout<<a[i][j]<<'\t';  
          }
     cout<<'\n';
   
      } 
 
 return 0;
}

 

 

转载于:https://www.cnblogs.com/mushroom_lb/archive/2008/10/10/1308253.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值