这个循环赛的问题描述在上篇中提到,晚上写了一下,也不难,主要是区分队伍的奇偶情况(奇数时有队伍要轮空),构出对阵环来!没有采用二分法!代码如下:
- #include<iostream>
- #include<iomanip>
- #define N 13 //确定参赛队伍的个数
- int Rounds=0;//循环轮数
- int EVEN[N]; //偶数队伍对阵环
- int ODD[N+1];//奇数队伍对阵环
- using namespace std;
- int main(){
- void Print();
- void Init();
- Init();
- Print();
- return 0;
- }
- void Init(){
- if(N%2==0){
- for(int i=0;i<N;i++)EVEN[i]=i+1;
- }//偶数个队伍
- else{
- ODD[0]=1;//固定不变的
- ODD[1]=0;//引入一个虚队伍,便于处理
- for(int i=2;i<N+1;i++)ODD[i]=i;
- }
- }
- void Print(){
- /*队伍数不满足对阵条件*/
- if(N<=1){
- cout<<"参赛队伍不足!"<<endl;
- return;
- }
- /*队伍数为偶数时*/
- else if(N%2==0){
- while(Rounds<N-1){//共进行N-1轮循环赛
- Rounds++;
- cout<<endl<<"第 "<<Rounds<<" 轮对阵场次如下:"<<endl<<endl;
- for(int i=1;i<=N;i++){
- cout<<"队伍"<<setw(2)<<i<<" Vs 队伍";
- for(int j=0;j<N;j++)if(EVEN[j]==i)break;
- cout<<setw(2)<<EVEN[N-j-1]<<endl; //两个对阵队伍的数组下标和为N-1;
- }
- if(N>2){
- int temp;
- temp=EVEN[1];
- EVEN[1]=EVEN[N-1];
- for(i=N-2;i>1;i--)
- EVEN[i+1]=EVEN[i];
- EVEN[2]=temp;
- }//产生下次比赛环
- }
- }
- /*队伍数为奇数时*/
- else{
- while(Rounds<N){//共今进行N轮循环赛
- Rounds++;
- cout<<endl<<"第 "<<Rounds<<" 轮对阵场次如下:"<<endl<<endl;
- for(int i=1;i<=N;i++){
- for(int j=0;j<=N;j++)if(ODD[j]==i)break;
- if(ODD[N-j]==0)cout<<"队伍"<<setw(2)<<i<<" 本轮轮空!"<<endl;
- else{
- cout<<"队伍"<<setw(2)<<i<<" Vs 队伍";
- cout<<setw(2)<<ODD[N-j]<<endl; //两个对阵队伍的数组下标和为N;
- }
- }
- if(N>2){
- int temp;
- temp=ODD[1];
- ODD[1]=ODD[N];
- for(i=N-1;i>1;i--)
- ODD[i+1]=ODD[i];
- ODD[2]=temp;
- }//产生下次比赛环
- }
- }
- }