跪求:循环日程表的分治法程序!

当n小于或等于1时,没有比赛。当n是偶数时,至少举行n-1轮比赛.当n是奇数时,至少举行n轮比赛,这时每轮必有一支球队轮空。为了统一奇数偶数的不一致性,当n为奇数时,可以... 当n 小于或等于1 时,没有比赛。
当n 是偶数时,至少举行n-1 轮比赛.
当n 是奇数时,至少举行n 轮比赛,这时每轮必有一支球队
轮空。
为了统一奇数偶数的不一致性,当n 为奇数时,可以加入第
n+1 支球队(虚拟球队,实际上不存在),并按n+1 支球队参加比
赛的情形安排比赛日程。那么n(n 为奇数)支球队时的比赛日程
安排和n+1 支球队时的比赛日程安排是一样的。只不过每次和
n+1 队比赛的球队都轮空。所以,我们只需考虑n 为偶数时情况
注:程序用C++编写的..可以直接运行的..不要有错误!!
等待各位高手解答.. 这个不行(回答者: qhm95 - 一级 2010)
急!..
展开
 我来答
qhm95
2010-04-18
知道答主
回答量:42
采纳率:0%
帮助的人:14万
展开全部
#include "stdio.h"

int a[10][10];
void tourna(int n)
{
if( n == 1 )
{
a[1][1] = 1;
return;
}
if (n%2!=0)
{ tourna (n+1);
return;}
tourna(n/2);
makecopy(n);
}

makecopy(int n)
{ if( (n/2>1) && (n%2!=0))
copyodd(n);
else
copy(n);
}
copy(int n)
{int i,j;
int m = n/2;
for( i = 1 ; i <= m ; i++ )
{
for( j = 1 ; j <= m ; j++ )
{
a[i][j + m] = a[i][j] + m;
a[i + m][j] = a[i][j + m];
a[i + m][j + m] = a[i][j];
}
}
}

copyodd(int n)
{ int m=n/2,b[100],i,j;
for ( i = 1 ; i <= m ; i++ )
b[i]=m+i;b[m+i]=b[i];
for( i = 1 ; i <= m ; i++ )
for ( j = 1 ; 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 ( i = 2 ; i <= m ; i++ )

a[i][m+j]=b[i+j-1];

a[b[i+j-1]][m+j]=i;

}}

main()
{ int n = 1,i,j;
int k;
scanf("%d",&n);

tourna(n);
for( i = 1 ; i <= n ; i++ )
{
for( j = 1 ; j <= n ; j++ )
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
MCE 中国
2025-03-12 广告
以下是虚拟筛选的简要流程图说明:1. **调研靶点**:确认是否有参考药物与结合模式信息。2. **建立模型**:基于靶点蛋白结构,参考已有药物结合信息或预测药物结合模式。3. **选择库源**:从多样性化合物库、上市药物分子库等中挑选合适... 点击进入详情页
本回答由MCE 中国提供
百度网友ecba46aab
2010-04-16 · TA获得超过2303个赞
知道大有可为答主
回答量:2477
采纳率:100%
帮助的人:2020万
展开全部
作业吧.
自己做对自己的成长有利哦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
huijiaxiong
2013-04-10
知道答主
回答量:1
采纳率:0%
帮助的人:1548
展开全部
1、设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:⑴每个选手必须与其他n-1个选手各赛一次;⑵每个选手一天只能赛一次;⑶循环赛一共进行n-1天。按此要求可将比赛日程表设计-成有n行和n-l列的一个表。在表中第i行和第j列处填入第i个选手在第j天所遇到的选手。用分治法编写为该循环赛设计一张比赛日程表的算法并运行实现、对复杂度进行分析。
算法思想:按分治策略,我们可以将所有选手对分为两组,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用这种一分为二的策略对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。

应该一样的
#include<stdio.h>
#define max 100
int b[max][max];
int main()
{
void roudrob(int k,int m);
int i,j,a;
printf("请输入参加比赛人数:(人数必须为2整数次幂)");
scanf("%d",&a);
roudrob(1,a);
for(i=0;i<a;i++)
{
for(j=0;j<a;j++)
{
printf("%4d",b[i][j]);
}
printf("\n");
}
}
void roudrob(int k,int m)
{
int i,j;
if(m==2)
{
b[k-1][0]=k;
b[k][0]=k+1;
}
else
{
roudrob(k,m/2);
roudrob(k+m/2,m/2);
}
for(i=k-1;i<k+m/2-1;i++)
{
for(j=m/2;j<m;j++)
{
b[i][j]=b[i+m/2][j-m/2];
}
}
for(i=k+m/2-1;i<k+m-1;i++)
{
for(j=m/2;j<m;j++)
{
b[i][j]=b[i-m/2][j-m/2];
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式