問題在註釋中已說明,直接貼代碼!
/*
* 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;
}