程序填空题:循环日程安排问题(分治法)
用分治法求解循环日程安排问题。设有n=$$2^{k}$$个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次。
(2)每个选手一天只能赛一次。
(3)循环赛在n-1天之内结束。
![图片2.png](~/21a7ab5d-b54b-456a-97dc-64724ecdf59b.png)
```c++
#include
#include
#include
using namespace std;
#define N 100
void Plan(int a[][N],int k)
{ int i,j,n,t,temp;
n=2; //n从2^1=2开始
a[1][1]=1; a[1][2]=2; //求解2个选手比赛日程,得到左上角元素
a[2][1]=2; a[2][2]=1;
for (t=1;t { temp=n;
n=n*2;
for (i=temp+1;i<=n;i++ ) //填左下角元素
for (j=1; j<=temp; j++)
@@[a[i][j]=a[i-temp][j]+temp](2); //产生左下角元素
for (i=1; i<=temp; i++) //填右上角元素
for (j=temp+1; j<=n; j++)
@@[a[i][j]=a[i+temp][(j+temp)% n]](2);
for (i=temp+1; i<=n; i++) //填右下角元素
for (j=temp+1; j<=n; j++)
@@[a[i][j]=a[i-temp][j-temp]](2);
}
}
int main()
{ int i,j,a[N][N],k,size;
cin>>k;
size=pow(2,k);
Plan(a,k);
for(i=1;i<=size;i++){
for(j=1;j<=size;j++)
{
cout< }
cout<}
return 0;
}
```
### 输入样例:
输入K值。
```in
3
```
### 输出样例:
输出比赛日程表。
```out
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
```
答案:
第1空:a[i][j]=a[i-temp][j]+temp
第2空:a[i][j]=a[i+temp][(j+temp)% n]
第3空:a[i][j]=a[i-temp][j-temp]
(1)每个选手必须与其他n-1个选手各赛一次。
(2)每个选手一天只能赛一次。
(3)循环赛在n-1天之内结束。
![图片2.png](~/21a7ab5d-b54b-456a-97dc-64724ecdf59b.png)
```c++
#include
#include
#include
using namespace std;
#define N 100
void Plan(int a[][N],int k)
{ int i,j,n,t,temp;
n=2; //n从2^1=2开始
a[1][1]=1; a[1][2]=2; //求解2个选手比赛日程,得到左上角元素
a[2][1]=2; a[2][2]=1;
for (t=1;t
n=n*2;
for (i=temp+1;i<=n;i++ ) //填左下角元素
for (j=1; j<=temp; j++)
@@[a[i][j]=a[i-temp][j]+temp](2); //产生左下角元素
for (i=1; i<=temp; i++) //填右上角元素
for (j=temp+1; j<=n; j++)
@@[a[i][j]=a[i+temp][(j+temp)% n]](2);
for (i=temp+1; i<=n; i++) //填右下角元素
for (j=temp+1; j<=n; j++)
@@[a[i][j]=a[i-temp][j-temp]](2);
}
}
int main()
{ int i,j,a[N][N],k,size;
cin>>k;
size=pow(2,k);
Plan(a,k);
for(i=1;i<=size;i++){
for(j=1;j<=size;j++)
{
cout< }
cout<
return 0;
}
```
### 输入样例:
输入K值。
```in
3
```
### 输出样例:
输出比赛日程表。
```out
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
```
答案:
第1空:a[i][j]=a[i-temp][j]+temp
第2空:a[i][j]=a[i+temp][(j+temp)% n]
第3空:a[i][j]=a[i-temp][j-temp]