循環賽日程表問題問題描述:
設有n(n = 2^k)位選手參加網球循環賽,循環賽共進行n-1天,每位選手要與其他n-1位選手比賽一場,且每位選手每天必須比賽一場,不能輪空。試按此要求爲比賽安排日程:
(1) 每個選手必須與其他n-1個選手各賽一場;
(2) 每個選手一天只能賽一場;
(3) 循環賽一共進行n-1天。
思路和代碼比較簡單,就不多解釋了^_^
#include <iostream>
#include <cstdio>
using namespace std;
int K, tab[1<<4][1<<4];
void solve(){
memset(tab, 0, sizeof(tab));
tab[0][0] = 1; //第一個選手
for (int i = 1; i <= K; ++i){ //以此處理1~2、1~4、1~8選手
int limit = 1 << (i - 1);
for (int j = 0; j < limit; ++j) for (int k = 0; k < limit; ++k){
tab[j + limit][k + limit] = tab[j][k]; //將左上角複製到右下角
tab[j + limit][k] = tab[j][k] + limit; //將左上角對應到左下角
tab[j][k + limit] = tab[j][k] + limit; //將左上角對應到右上角
}
}
}
void out(){ //輸出結果
for (int i = 0; i < (1 << K); ++i){
for (int j = 0; j < (1 << K); ++j)
printf("%2d ", tab[i][j]);
cout << endl;
}
}
int main()
{
while (cin >> K){ //比賽選手數爲2^K個
solve();
out();
}
return 0;
}