循环赛日程表用递归算法有什么方便吗?

虫洞 2008-11-02 09:48:18
循环赛日程表
有n个选手,每个选手与其他n-1个选手各赛一场,每个选手一天只能赛一场
当n为偶数,比赛n-1天,当n为奇数,比赛n天
要求设计满足以上要求的比赛日程表

课本一般用递归分治的算法来解循环赛日程表的问题,对n为奇数时的复制不清楚

#include "stdio.h"
#include "conio.h"

int a[100][100]={0}; /*数组a为全局变量*/
int b[100]={0};

/*n为偶数复制*/
void copy(int n)
{
int i,j,m=n/2;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
a[i][j+m]=a[i][j]+m; /*左下角相对左上角同列元素加n/2*/
a[i+m][j]=a[i][j+m]; /*右上角复制左下角*/
a[i+m][j+m]=a[i][j]; /*右下角复制左上角*/
}
}
/*n为奇数复制*/
void copyodd(int n)
{
int i,j,m=n/2;
for(i=0;i<m;i++)
{
b[i]=m+i;b[m+i]=b[i];
}
for(i=0;i<m;i++)
{
for(j=0;j<m+1;j++)
{
if(a[i][j]>m){a[i][j]=b[i];a[m+i][j]=(b[i]+m)%n;}
else a[m+i][j]=a[i][j]+m;
}
for(j=1;j<m;j++)
{
a[i][m+j]=b[i+j-1];
a[b[i+j-1]][m+j]=i;
}
}
}
/*复制函数*/
void makecopy(int n)
{
if(n/2>1&&n%2==1)copyodd(n);
else copy(n);
}

/*划分函数*/
void tournament(int n)
{
if(n==1){a[0][0]=1;return;}
else if(n%2==1){tournament(n+1);return;}
tournament(n/2);
makecopy(n);
}



void main()
{

int i,j,n=10;

tournament(n);
for(i=0;i<n;i++) /*输出日程表*/
{
for(j=0;j<n;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}

getch();
}
...全文
735 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sissi_liqian 2010-04-22
  • 打赏
  • 举报
回复
能不能解释一下那个表的具体含义,谢谢
虫洞 2008-11-03
  • 打赏
  • 举报
回复
发现错误了
自己当时想当然了
觉得要改成输出单循环用循环来编程还有难度
是不是要回到递归啊

怎样用循环的来修改
  • 打赏
  • 举报
回复
还有,你的解法是不对的。
你输出的是双循环赛制,每两个选手之间比赛了两次。
  • 打赏
  • 举报
回复
递归分治并不一定就是效率最高的做法(递归的层数太多带来的负面影响越大),人们喜欢这样做往往是因为这样实现起来思路简单清晰。

就这个问题本身而言,当然可以不用递归,直接循环效率更高,也很直观。
seace 2008-11-03
  • 打赏
  • 举报
回复
算法的时间复杂度有区别
  • 打赏
  • 举报
回复
建议还是回到递归的思路,清晰明了,这也是各种教材对这个题都采用递归分析的原因。
如果一定要用单循环来实现,保证每天一赛的同时还要保证前后赛事不重复,规律不是太好找。
虫洞 2008-11-02
  • 打赏
  • 举报
回复
如果只是为了的到这个循环赛日程表
递归算法有什么方便?

直接用一个循环对数组赋值不就可以得出了吗

#include "stdio.h"
#include "conio.h"

main()
{
int i,j,n,n1,a[100][100];
n=5;
n1=n; /*当n为偶数,比赛进行n-1天*/
if(n>1&&n%2==1)n1=n+1; /*当n为奇数,比赛进行n天*/
for(i=0;i<n;i++)
{

for(j=0;j<n1;j++)
{
a[i][j]=(i+j+1)%n1; /*当n为偶数,余数为0,置0为n*/
if(n1==n&&a[i][j]==0)a[i][j]=n; /*当n为奇数,余数为0,表示轮空*/
}
}

for(i=0;i<n;i++)
{

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

getch();
}

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧