循环赛日程表问题之二

这个循环赛的问题描述在上篇中提到,晚上写了一下,也不难,主要是区分队伍的奇偶情况(奇数时有队伍要轮空),构出对阵环来!没有采用二分法!代码如下:

  1. #include<iostream>
  2. #include<iomanip>
  3. #define N 13 //确定参赛队伍的个数
  4. int Rounds=0;//循环轮数
  5. int EVEN[N]; //偶数队伍对阵环
  6. int ODD[N+1];//奇数队伍对阵环
  7. using namespace std;
  8. int main(){
  9.  void Print();
  10.  void Init();
  11.  Init();
  12.  Print();
  13.     return 0;
  14. }
  15. void Init(){
  16.     if(N%2==0){
  17.   for(int i=0;i<N;i++)EVEN[i]=i+1;
  18.  }//偶数个队伍
  19.  else{
  20.      ODD[0]=1;//固定不变的
  21.   ODD[1]=0;//引入一个虚队伍,便于处理
  22.         for(int i=2;i<N+1;i++)ODD[i]=i;
  23.  }
  24. }
  25. void Print(){
  26.   /*队伍数不满足对阵条件*/
  27.   if(N<=1){
  28.    cout<<"参赛队伍不足!"<<endl;
  29.    return;
  30.   }
  31.   /*队伍数为偶数时*/
  32.   else if(N%2==0){
  33.     while(Rounds<N-1){//共进行N-1轮循环赛
  34.       Rounds++;
  35.       cout<<endl<<"第 "<<Rounds<<" 轮对阵场次如下:"<<endl<<endl;
  36.       for(int i=1;i<=N;i++){
  37.        cout<<"队伍"<<setw(2)<<i<<" Vs 队伍";
  38.        for(int j=0;j<N;j++)if(EVEN[j]==i)break;
  39.        cout<<setw(2)<<EVEN[N-j-1]<<endl; //两个对阵队伍的数组下标和为N-1;
  40.       }
  41.       if(N>2){
  42.        int temp;
  43.        temp=EVEN[1];
  44.        EVEN[1]=EVEN[N-1];
  45.        for(i=N-2;i>1;i--)
  46.         EVEN[i+1]=EVEN[i];
  47.        EVEN[2]=temp;
  48.       }//产生下次比赛环
  49.     }
  50.   }
  51.   /*队伍数为奇数时*/
  52.   else{
  53.           while(Rounds<N){//共今进行N轮循环赛
  54.      Rounds++;
  55.      cout<<endl<<"第 "<<Rounds<<" 轮对阵场次如下:"<<endl<<endl;
  56.      for(int i=1;i<=N;i++){
  57.       for(int j=0;j<=N;j++)if(ODD[j]==i)break;
  58.       if(ODD[N-j]==0)cout<<"队伍"<<setw(2)<<i<<" 本轮轮空!"<<endl;
  59.       else{
  60.        cout<<"队伍"<<setw(2)<<i<<" Vs 队伍";
  61.           cout<<setw(2)<<ODD[N-j]<<endl; //两个对阵队伍的数组下标和为N;
  62.       }
  63.      }
  64.      if(N>2){
  65.         int temp;
  66.      temp=ODD[1];
  67.      ODD[1]=ODD[N];
  68.      for(i=N-1;i>1;i--)
  69.          ODD[i+1]=ODD[i];
  70.      ODD[2]=temp;
  71.      }//产生下次比赛环
  72.     }
  73.   }
  74. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值