1. 程式人生 > >C++_迴圈賽日程

C++_迴圈賽日程

問題描述

問題描述:

設有n=2^k 個運動員要進行網球迴圈賽。現要設計一個滿足以下要求的比賽日程表:

     (1)每個選手必須與其他n-1個選手各賽一次;
     (2)每個選手一天只能參賽一次;
     (3)迴圈賽在n-1天內結束。

設計思路

設計思路:建立二維陣列a[N][N],存放1-N名運動員的迴圈賽事情況。初始化為0;當day從1->N時,遍歷陣列,當二維陣列元素a[i][j]行不等於列且所儲存元素為0時,遍歷a[i][N]和a[N][j],如果a[i][N]和a[N][j]所儲存元素均不包含day,則另a[i][j]=day;迴圈結束後輸出a[N][N],然後按照day從1-N的順序輸出表a[N][N]中對戰情況

資料結構

N=2^k=8:比賽人數

a[N][N]:存放運動員日程安排結果

x[N],y[N]:工作陣列,分別存放第i行j列的安排情況

演算法描述:

CYCLE RACE(N, a[N][N], x[N], y[N])

  1. For i=0 to N-1,  j=0 to N-1
  2.  a[i][j] <-0
  3. for day=1 to N
  4.  for i=1 to N, j=1 to N
  5.   If(search(i, j, day, a)=0 and i!=j and a[i][j]=0)
  6.    then a[i][j] =day, a[j][i]=day;
  7. Output(a)

SEARCH (i, j, day, a)

  1. For k=0 to N-1
  2.  x[k]<-a[i][k], y[k]<-a[k][j]
  3. For k=0 to N-1
  4.  If(x[k]=day or y[k]=day)
  5.   then return 1
  6. Return 0

測試用例及結果說明

運動員人數:N=8

測試結果:

 運動員對戰情況表:(以8個人為例)

0 1 2 3 4 5 6 7

1 0 3 2 5 4 7 6

2 3 0 1 6 7 4 5

3 2 1 0 7 6 5 4

4 5 6 7 0 1 2 3

5 4 7 6 1 0 3 2

6 7 4 5 2 3 0 1

7 6 5 4 3 2 1 0

比賽日程安排結果為

第1天的比賽安排為

隊員1 對戰 隊員2   隊員3 對戰 隊員4   隊員5 對戰 隊員6   隊員7 對戰 隊員8

第2天的比賽安排為

隊員1 對戰 隊員3   隊員2 對戰 隊員4   隊員5 對戰 隊員7   隊員6 對戰 隊員8

第3天的比賽安排為

隊員1 對戰 隊員4   隊員2 對戰 隊員3   隊員5 對戰 隊員8   隊員6 對戰 隊員7

第4天的比賽安排為

隊員1 對戰 隊員5   隊員2 對戰 隊員6   隊員3 對戰 隊員7   隊員4 對戰 隊員8

第5天的比賽安排為

隊員1 對戰 隊員6   隊員2 對戰 隊員5   隊員3 對戰 隊員8   隊員4 對戰 隊員7

第6天的比賽安排為

隊員1 對戰 隊員7   隊員2 對戰 隊員8   隊員3 對戰 隊員5   隊員4 對戰 隊員6

第7天的比賽安排為

隊員1 對戰 隊員8   隊員2 對戰 隊員7   隊員3 對戰 隊員6   隊員4 對戰 隊員5

設計及測試過程

第一步:提出問題;

第二步:問題轉換;

第三步:演算法構思;

第四步:偽碼描述;

第五步:程式碼編寫;

第六步:程式碼測試;

第七步:程式碼修正;

參考資料:《c ++程式設計教程》高等教育出版社

評價和改進

演算法優點:可以排出所有運動員的對戰安排表和日程安排表

演算法缺點:遍歷的方式使得演算法時間和空間花費較大,所列出的解不是活動安排的所有解

附:源程式

#include<iostream>

using namespace std;

#define N 8      //運動員人數,可根據實際自行調整

int search(int i,int j, int day, int a[N][N])

{

    int x[N], y[N], k;

    for(k=0;k<N;k++)

    {

         x[k]=a[i][k];

         y[k]=a[k][j];

    }

    for(k=0;k<N;k++)

    {

         if(x[k]==day||y[k]==day)

             return 1;

    }

    return 0;

}

int main()

{

    int a[N][N], i, j, day, x[N], y[N], k;

    for(i=0;i<N;i++)

         for(j=0;j<N;j++)

             a[i][j]=0;

    for(day=1;day<N;day++)

    {

         for(i=0;i<N;i++)

             for(j=0;j<N;j++)

                 if(search(i,j,day,a)==0&&i!=j&&a[i][j]==0)

                  {

                      a[i][j]=day;

                      a[j][i]=day;

                  }

    }

    cout<<"運動員對戰情況表:(以8個人為例)"<<endl;

    for(i=0;i<N;i++)

    {

         for(j=0;j<N;j++)

             cout<<a[i][j]<<" ";

         cout<<endl;

    }

    cout<<"比賽日程安排結果為"<<endl;

    for(k=1;k<N;k++)

    {

         cout<<"第"<<k<<"天的比賽安排為"<<endl;

         for(i=0;i<N;i++)

             for(j=i;j<N;j++)

                  if(a[i][j]==k)

                      cout<<"隊員"<<i+1<<" 對戰 隊員"<<j+1<<"   ";

         cout<<endl;

    }

    system("pause");

    return 0;

}