1.问题描述:有n=2^k个运动员进行网球循环赛,每个选手必须与其他n-1个选手各赛一次,1个选手1天只能比赛一次,设计日程表,有n行n-1列,第i行第j列为第i个选手第j天遇到的敌手;
2.分析递归方法:日程表分相等四块,左下的值分别等于左上的值加(n/2);左上分别等于右下;左下分别等于右上
3.二维指针作为实参传递,形参定义为指向一维数组的指针;
#include<stdio.h>
#define MAX 20
void dfs(int (*A)[MAX],int n)
{
int i,j;
int m=n/2;
if(m==0)//递归结束条件
return;
dfs(A,m);
for(i=1;i<=m;i++)//k=1,m=1;k=2,m=2;k=3;m=4
{
for(j=1;j<=m;j++)
{
A[m+i][j]=A[i][j]+m;//依次对左下角赋值
A[m+i][m+j]=A[i][j];//依次对右下角赋值
A[i][m+j]=A[m+i][j];//依次对右上角赋值
}
}
}
int main()
{
int i,j,n,k;
int A[MAX][MAX];
scanf("%d",&k);
n=1;
for(i=0;i<k;i++)
n*=2;
A[1][1]=1;
dfs(A,n);
for(i=1;i<=n;i++)//输出,第i行第j列,存放的第i个选手第j天遇到的对手
{
for(j=1;j<=n;j++)
{
printf("%d ",A[i][j]);
}
printf("\n");
}
return 0;
}