比賽賽程安排算法--分治算法

問題在註釋中已說明,直接貼代碼!

/*
 * bisaisaicheng.c
 *
 *  Created on: Nov 30, 2013
 *      Author: bing
 *
 *      每個選手必須與其他所有選手進行一次比賽,且每位選手每天必須比賽一場
 *      利用分治算法來簡化日程的安排,一分爲二的方法
 *    例如:
 *      請輸入比賽人數,必須爲2的冪次:8
		編 號 	第1天	第2天	第3天	第4天	第5天	第6天	第7天
		1       2       3       4       5       6       7       8
		2       1       4       3       6       5       8       7
		3       4       1       2       7       8       5       6
		4       3       2       1       8       7       6       5
		5       6       7       8       1       2       3       4
		6       5       8       7       2       1       4       3
		7       8       5       6       3       4       1       2
		8       7       6       5       4       3       2       1
 *
 */
#include <stdio.h>

#define MAX_NUM 16
int biao[MAX_NUM+1][MAX_NUM+1];

int schedule(int begin,int num){

	int i,j,k=num;
/*檢查比賽人數是否爲2的冪次*/
	while(k%2==0)
		k=k/2;
	if(k!=1){
		printf("比賽人數必須是2的冪次!");
		return -1;
	}
/* 此處開始利用分治算法,遞歸解決問題*/
	if(num==2){
		biao[begin][1]=begin;
		biao[begin][2]=begin+1;
		biao[begin+1][1]=begin+1;
		biao[begin+1][2]=begin;
		return 0;
	}

	schedule(begin,num/2);
	schedule(begin+num/2,num/2);
	/*填充右下半部*/
	for(i=begin+num/2;i<begin+num;i++){
		for(j=num/2+1;j<=num;j++)
			biao[i][j]=biao[i-num/2][j-num/2];
	}
	/*填充右上半部*/
	for(i=begin;i<begin+num/2;i++){
		for(j=num/2+1;j<=num;j++)
			biao[i][j]=biao[i+num/2][j-num/2];
	}
	return 0;
}

其中有一點疑惑,全局變量中的MAX_NUM怎樣能避免兩個文件重複定義?請留言,謝謝


/*
 * main.c
 *
 *  Created on: Nov 30, 2013
 *      Author: bing
 */

#define MAX_NUM 16
extern int biao[MAX_NUM+1][MAX_NUM+1];

int main(){
	int num;
	printf("請輸入比賽人數,必須爲2的冪次:");
	scanf("%d",&num);
	int result=schedule(1,num);
	if(result<0)
		return -1;

	int i,j;
	printf("編 號 ");
	for(i=1;i<num;i++){

		printf("\t第%d天",i);
	}
	printf("\n");
	for(i=1;i<=num;i++){
		for(j=1;j<=num;j++){
			printf("%-8d",biao[i][j]);
		}
		printf("\n");
	}
	return 0;
}

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