用C语言程序进行比赛日程排列
#include <stdio.h> #define MAXN 64 int a[MAXN+ 1][MAXN +1] = {0}; // 定义全局的数组,最多安排64个选手的比赛日程 void gamecal(int k, int n)// 定义赛程安排的函数,k表示需要安排的选手起始的序号 n表示需要安排选手的数量 { // 若k为1,n为4表示四个选手排序,从第1个起。int i, j;if(n == 2) // n== 2 ,两位选手 直接安排赛程。{a[k][1] = k; // 参赛选手编号a[k][2] = k+1; // 对阵选手的编号a[k+1][1] = k+1; //参赛选手编号a[k+1][2] = k; // 对阵选手编号} else{ // 若不是2个选手。gamecal(k,n/2); // 分治 举例: 若此时k=1,n=4 ,排1,2选手gamecal( k + n/2, n/2); // 分治 安排3,4选手for( i = k; i< k+n/2; i++)// 合并 填充右上角{for(j = n/2+1; j<=n; j++) {a[i][j] = a[i +n/2][j - n/2];}}for( i = k+n/2; i< k+n; i++)// 合并 填充左下角{for(j = n/2+1; j<=n; j++) {a[i][j] = a[i - n/2][j - n/2]; // a[i + n/2][j - n/2] ——> a[i - n/2][j - n/2]}}} } int main() {int m,i,j;printf("输入参赛选手人数: ");scanf("%d",&m) ;j = 2; //定义为2的整数幂for(i=2;i < 8; i++){j = j*2;if(j == m)break;}if(i >= 8){printf("参赛选手必须为2的整数次幂,且不超过64! \n");getch();return 0;}gamecal(1,m);printf("\n编号 ");for (i = 2; i<=m; i++)printf("%2d天",i-1);printf("\n");for(i = 1;i<= m; i++){for(j = 1; j<= m; j++)printf("%4d", a[i][j]);printf("\n");}getch();return 0; }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374