天天看點

C語言:循環日程表

一、【實驗目的及要求】

1.掌握分治政策的基本思想。

2.學會運用分治政策的思想解決實際問題(如:循環賽日程表)。

3.掌握使用分治政策思想解決實際問題。

二、【實驗内容】

設計一個滿足以下要求的比賽日程表:

(1)每個選手必須與其他n-1個選手各賽一次;

(2)每個選手一天隻能賽一次;

(3)循環賽一共進行n-1天。

要求:對8個選手進行循環賽日程表的安排,并輸出安排的方式截圖,如下截圖是當有2個和4個選手時,安排方式的輸出。

C語言:循環日程表
C語言:循環日程表

編譯思路來源于:

分治算法,循環比賽日程表,講評_哔哩哔哩_bilibili分治算法,循環比賽日程表,講評

C語言:循環日程表

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;
}
           

繼續閱讀