循环日赛表
设你班有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:1. 每个选手必须与其他n-1个选手各赛一次。
2. 每个选手一天只能参赛一次。
3. 循环赛在n-1天内结束。
我已经用非递归的方法实现了,不过我想用递归再做一下,该怎么做啊
非递归方法如下:
程序代码:
//此为非递归算法 #include <stdio.h> #include <math.h> const int N=100; int a[N][N]; void func(int s) { int n; int js; js=1; n=int(pow(2,s));//2的s次方 while(js<s) { for(int i=0;i<int(pow(2,js));i++)//切记,这里每次循环的次数不一样,否则出错,不是n/2 { for(int j=0;j<int(pow(2,js));j++) { //if(a[i][j+2*js]==0 && a[i+2*js][j]==0 && a[i+2*js][j+2*js]==0) // { a[i][j+int(pow(2,js))]= a[i][j]+int(pow(2,js));//每隔 pow(2,js),而不是2*js a[i+int(pow(2,js))][j]=a[i][j]+int(pow(2,js)); a[i+int(pow(2,js))][j+int(pow(2,js))]=a[i][j]; // a[i+2*js][j+2*js] // } } } js++; } } void main() { int n,s; int i,j; a[0][0]=1; a[0][1]=a[1][0]=2;//初始化 a[1][1]=1; printf("请输入运动员的个数(2^s中s的值):"); scanf("%d",&s); n=int(pow(2,s)); func(s); for(i=0;i<n;i++) { for(j=0;j<n-1;j++) { if(j==0) printf("%2d号选手:",a[i][j]); printf("%2d ",a[i][j+1]); } printf("\n"); } }