一、【實驗目的及要求】
1.掌握分治政策的基本思想。
2.學會運用分治政策的思想解決實際問題(如:循環賽日程表)。
3.掌握使用分治政策思想解決實際問題。
二、【實驗内容】
設計一個滿足以下要求的比賽日程表:
(1)每個選手必須與其他n-1個選手各賽一次;
(2)每個選手一天隻能賽一次;
(3)循環賽一共進行n-1天。
要求:對8個選手進行循環賽日程表的安排,并輸出安排的方式截圖,如下截圖是當有2個和4個選手時,安排方式的輸出。
編譯思路來源于:
分治算法,循環比賽日程表,講評_哔哩哔哩_bilibili分治算法,循環比賽日程表,講評
https://www.bilibili.com/video/BV1rp4y1X7mb?from=search&seid=7544630823193435744&spm_id_from=333.337.0.0
代碼:編譯環境VS2019
#include<stdio.h>
int a[100][100];
int i, j, d,x,x1, x2, y, y1, y2;
//延續長度;→
void Yx_day(int x , int y , int d) {
for (i = x; i <= x + d - 1;i++) {
for (j = y; j <= y + d - 1; j++) {
a[i][j+d] = a[i][j]+d;
}
}
}
//複制到另一個正方形;
void Jx_day(int x1, int y1, int d, int x2, int y2) {
for (int i = 0; i <= d - 1; i++) {
for (int j = 0; j <= d - 1; j++) {
a[x2 + i][y2 + j] = a[x1 + i][y1 + j];
}
}
}
void Pr_day(int x,int y,int d) {
for (i = 0; i < d; i++) {
for (j = 0; j < d; j++) {
printf("%4d",a[x+i][y+j]);
}
printf("\n\n");
}
}
int main() {
int k;
printf("輸入k:");
scanf_s("%d", &k);
printf("\n");
d = 1; //初始延續
a[1][1] = 1;
for (int i = 0; i < k; i++) {
Yx_day(1, 1, d); //延續長度;→
Jx_day(1, 1, d, 1 + d, 1 + d);//複制到另一個正方形;↘
Jx_day(1, 1 + d, d, 1 + d, 1);//複制到另一個正方形;↙
d = d * 2; //階乘 n=2^k
}
Pr_day(1, 1, d);
return 0;
}