分治法:循環賽日程表問題

循環賽日程表問題問題描述:
   設有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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章