循环日赛表
设你班有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");
}
}







