前段时间做循环日程赛始终理解不了,网上搜了一下,发现与自己遇到的不一样,实现之后记录下来。 #include <math.h> #include <stdio.h> #include "malloc.h" /************************************************************************/ /* 循环赛算法参变量 */ /************************************************************************/ int k;//参赛队伍次幂数 int N;//队伍数量 int ** R;//赛程记录 /************************************************************************/ /* 循环赛算法 */ /************************************************************************/ void Table() { int m,i,j,t,s,n=N; for (i = 1;i<=N;i++) R[1][i] = i; m=1; for (s = 1;s<=k;s++) { n /= 2; for(t=1;t<=n;t++) for(i = m+1;i<=2*m;i++) for (j=m+1;j<=2*m;j++) { R[i][j+(t-1)*m*2] = R[i-m][j+(t-1)*2*m-m];//左上角到右下角 R[i][j+(t-1)*m*2-m] = R[i-m][j+(t-1)*2*m];//右上角到左下角 } m*=2; } } /************************************************************************/ /* 测试函数 */ /************************************************************************/ void TestFunc() { int i,j; printf("/t/t/t/t循环赛/n"); printf("输入队伍数量(2 的正整数次幂):"); scanf("%d",&k); N = pow(2,k); printf("参赛队伍数量为:%d/n",N); R = new int*[N+2]; for (i = 0;i<=N;i++) R[i] = new int[N+2]; printf("比赛安排如下:/n"); Table(); for (i = 1;i<=N;i++) { for(j=1;j<=N;j++) printf("%-5d",R[i][j]); printf("/n"); } free(R); } /************************************************************************/ /* Main Function */ /************************************************************************/ void main() { TestFunc(); }