循环日程表问题

来源:互联网 发布:表达知错的句子 编辑:程序博客网 时间:2024/06/03 18:57

1.问题描述:有n=2^k个运动员进行网球循环赛,每个选手必须与其他n-1个选手各赛一次,1个选手1天只能比赛一次,设计日程表,有n行n-1列,第i行第j列为第i个选手第j天遇到的敌手;

2.分析递归方法:日程表分相等四块,左下的值分别等于左上的值加(n/2);左上分别等于右下;左下分别等于右上

3.二维指针作为实参传递,形参定义为指向一维数组的指针;


#include<stdio.h>#define MAX 20void 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;}


原创粉丝点击