1. 程式人生 > >noip1996 比賽安排

noip1996 比賽安排

A1107. 比賽安排 時間限制:1.0s   記憶體限制:256.0MB   總提交次數:388   AC次數:179   平均分:57.73 試題來源   NOIP1996 提高組 問題描述   設有有2n(n<=6)個球隊進行單迴圈比賽,計劃在2n – 1天內完成,每個隊每天進行一場比賽。設計一個比賽的安排,使在2n – 1天內每個隊都與不同的對手比賽。
  例如n=2時的比賽安排:
  隊 1 2 3 4
  比賽 1==2 3==4 一天
  1==3 2==4 二天
  1==4 2==3 三天 輸入格式   輸入的第一行包含以個整數n。 輸出格式   輸出2^n-1行,每行開頭為一對尖括號,裡面輸出天數序號。隨後寫出這天的安排。詳細格式見樣例。有多個方案則輸出字典序最小的方案。 樣例輸入 2 樣例輸出 <1>1-2,3-4
<2>1-3,2-4
<3>1-4,2-3 資料規模和約定   n<=6

解析:hash判重。

           用b[i][j]來記錄 i 與 j 是否進行過比賽,一共n個球隊。

          題目上雖然沒說,但輸出應當按照字典序輸出。

程式碼:

#include<cstdio>
#include<cstring>
#define maxn 100
using namespace std;
bool a[maxn],b[maxn][maxn];
int main()
{
  int n,i,j,k,s,sum;
  scanf("%d",&n);
  s=1<<n;
  for(i=1;i<s;i++)
     {
       memset(a,0,sizeof(a));
       printf("<%d>",i);
       sum=0;
       for(j=1;j<s;j++)
         for(k=j+1;k<=s;k++)
           if(!a[j] && !a[k] && !b[j][k] && !b[k][j])
             {
               a[j]=a[k]=1;
               b[j][k]=b[k][j]=1,sum++;
               printf("%d-%d",j,k);
               if(sum<(s>>1))printf(" ");
             }
        printf("\n");     
     }
  return 0;
}