分治法求循环赛的算法的几点不解之处,求高手指点

kakajenifer 2003-08-30 10:53:52
高程书的例题(见下)。提两个问题。
1.书里说的左上角左下角的加4规律我知道,但是右下角它怎么定的?右上角又是怎么定的?怎么看起来特别扭啊??没发现其他的规律啊!(偶很笨啦~)
2.变量twom1代表什么意思?twom又表示什么意思啊??
----------------------
【问题】循环赛日程表
问题描述:设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能参赛一次;
(3)循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。
按分治策略,我们可以将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。

1
1 2
2 1
(1)

1 2 3
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
(2)

1 2 3| 4 5 6 7
_|_______________________|________________________________
1| 2 3 4| 5 6 7 8
2| 1 4 3| 6 7 8 5
3| 4 1 2| 7 8 5 6
4| 3 2 1| 8 5 6 7
_|_______________________|_________________________________
5| 6 7 8| 1 4 3 2
6| 5 8 7| 2 1 4 3
7| 8 5 6| 3 2 1 4
8| 7 6 5| 4 3 2 1

(3)

图1 2个、4个和8个选手的比赛日程表
图1所列出的正方形表(3)是8个选手的比赛日程表。其中左上角与左下角的两小块分别为选手1至选手4和选手5至选手8前3天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样我们就分别安排好了选手1至选手4和选手5至选手8在后4天的比赛日程。依此思想容易将这个比赛日程表推广到具有任意多个选手的情形。
----------------
#include <stdio.h>
#define MAXN 64
int a[MAXN+1][MAXN];
main()
{
int towm1,twom,i,j,m,k;
printf("指定n(=2的k次幂)位选手,请输入k。\n",&k);
scanf("%d",&k);
a[1][1]=2;
a[2][1]=1;
m=1;twom1=1;
while(m<k)
{
m++;
twom1+=twom1;twom=2*twom1;
for(i=twom1+1;i<=twom;i++)
for(j=1;j<=twom1-1;j++)
a[i][j]=a[i-twom1][j]+twom1;
a[1][twom1]=twom1+1;
for(i=2;i<=twom1;i++)a[i][twom1]=a[i-1][twom1]+1;
for(j=twom1+1;j<twom;j++)
{
for(i=1;i<twom1;i++)
a[i][j]=a[i+1][j-1];
a[twom1][j]=a[1][j-1];
}
for(j=twom1;j<twom1;j++)
for(i=1;i<=twom1;i++)
a[a[i][j]][j]=i;
for(i=1;i<=twom;i++)
{
for(j=1;j<twom;j++)
printf("%4d",a[i][j]);
printf("\n");
}
printf("\n");
}
}
...全文
124 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhangYv 2003-08-31
  • 打赏
  • 举报
回复
用高程的书来学习算法我觉得是很不好的。因为面对应付考试类型的书非常深涩,还故作玄虚和自找麻烦。建议你去找找专门的算法书看看,这个问题如果写成递归形式还是比较容易理解的。分治算法有固定的结构!

33,008

社区成员

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

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