锦标赛问题 - 递归

设有n位选手参加网球循环赛,n=2^k,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天比赛一场,不能轮空,按一下要求为比赛安排日程, (1) 每位选手必须与其他n-1格选手格赛一场; (2) 每个选手每天只能赛一场; (3) 循环赛一共进行n-1天; 

请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行和第j列处填入第i个选手在第j天所遇到的选手,其中1≤i≤n,1≤j≤n-1。

代码部分:

#include<stdio.h>
#define N 64
int a[N][N];
int x; //填充值
void digui(int i,int j,int n,int x)
{


if(n==1)
{
  a[i][j]=x;
return ;
}
   //填充x
digui(i,j,n/2,x); //填充左上角
digui(i+n/2,j+n/2,n/2,x);//在上一个递归执行完回退一次后的循环中执行 填充右下角

digui(i,j+n/2,n/2,x+n/2);//在上一个递归执行完回退一次后的循环中执行 填充右上角
digui(i+n/2,j,n/2,x+n/2);//在上一个递归执行完回退一次后的循环中执行 填充左下角





}
int main()
{
int n;
int i,j;
x =1;
scanf("%d",&n);
digui(0,0,n,x);//起始位置为(0,0),总人数为n

for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
printf("%d ",a[i][j]);
}
printf("%d\n",a[i][n-1]);
}
return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值