分治法-网球选拔赛

sandsboy 2004-03-28 11:40:29
有n(n是2的幂)人参加网球选拔赛,比赛采用单循环,即每人要参加n-1场比赛。假定每人每天只有一场比赛,则选拔赛需要n-1天。比赛的日程表可用这样的矩阵A表示,行号i表示第i个运动员,列号j表示第j天,aij(1<=aij<=n)表示第i个运动员在第j天要与运动员aij想遇。(注:其中aij,i、j是a的下标,和数组的下标一样的)试用分治法编写为该选拔赛设计一张日程表的算法。
...全文
110 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandsboy 2004-03-31
  • 打赏
  • 举报
回复
俺自己搞定了
#include <iostream.h>
#include <iomanip.h>
#define N 16
int L[N][N];

void Assign(int n,int r1,int c1);
void DivideAndConquer(int n,int r1,int c1,int r2,int c2);
void Display(int n);
void Copy(int n,int r1,int c1,int r2,int c2);

void main()
{
int n;
cout<<"please input n:";
cin>>n;
DivideAndConquer(n,1,1,n,n);
Display(n);
}

void Assign(int n,int r1,int c1)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) L[r1+i-1][c1+j-1]=c1;
else L[r1+i-1][c1+j-1]=c1+1;
}
return;
}

void DivideAndConquer(int n,int r1,int c1,int r2,int c2)
{
if(n==2) Assign(n,r1,c1);
else
{
n/=2;
DivideAndConquer(n,r1,c1,r1+n-1,c1+n-1);
Copy(n,r1+n,c1+n,r1,c1);
DivideAndConquer(n,r1,c1+n,r1+n-1,c2);
Copy(n,r1+n,c1,r1,c1+n);

}
return;
}

void Display(int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<setw(3)<<L[i][j];
cout<<endl;
}
return;
}
void Copy(int n,int r1,int c1,int r2,int c2)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
L[r1+i-1][c1+j-1]=L[r2+i-1][c2+j-1];
return;
}
sandsboy 2004-03-31
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <iomanip.h>
#define N 16
int L[N][N];

void Assign(int n,int r1,int c1);//赋值
void DivideAndConquer(int n,int r1,int c1,int r2,int c2);//分治
void Display(int n);//输出
void Copy(int n,int r1,int c1,int r2,int c2);//对角线复制

void main()
{
int n;
cout<<"please input n:";
cin>>n;
DivideAndConquer(n,1,1,n,n);
Display(n);
}

void Assign(int n,int r1,int c1)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) L[r1+i-1][c1+j-1]=c1; //主对角线元素赋值
else L[r1+i-1][c1+j-1]=c1+1;//非对角线元素赋值
}
return;
}

void DivideAndConquer(int n,int r1,int c1,int r2,int c2)
{
if(n==2) Assign(n,r1,c1);
else
{
n/=2;
DivideAndConquer(n,r1,c1,r1+n-1,c1+n-1);
Copy(n,r1+n,c1+n,r1,c1);//主对角线复制,左上方阵复制到右下方阵
DivideAndConquer(n,r1,c1+n,r1+n-1,c2);
Copy(n,r1+n,c1,r1,c1+n);//次对角线复制,右上方阵复制到左下方阵

}
return;
}

void Display(int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<setw(3)<<L[i][j];
cout<<endl;
}
return;
}
void Copy(int n,int r1,int c1,int r2,int c2)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
L[r1+i-1][c1+j-1]=L[r2+i-1][c2+j-1];
return;
}

33,010

社区成员

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

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