循环赛日程表实验报告

③用一个for循环将问题分成几部分,对于k=3,n=8,将问题分成3大部分,第一部分为,根据已经填充的第一行,填写第二行,第二部分为,根据已经填充好的第一部分,填写第三四行,第三部分为,根据已经填充好的前四行,填写最后四行。

for (int s=1;s<=k;s++) N/=2;

④用一个for循环对③中提到的每一部分进行划分

for(int t=1;t<=N;t++)

对于第一部分,将其划分为四个小的单元,即对第二行进行如下划分

同理,对第二部分(即三四行),划分为两部分,第三部分同理 ⑤最后,根据以上for循环对整体的划分和分治法的思想,进行每一个单元格的填充。填充原则是:对角线填充 for(int i=m+1;i<=2*m;i++) //i控制行 for(int j=m+1;j<=2*m;j++) //j控制列 {

a[i][j+(t-1)*m*2] = a[i-m][j+(t-1)*m*2-m];/*右下角的值等于左上角的值 */

a[i][j+(t-1)*m*2-m] = a[i-m][j+(t-1)*m*2];/*左下角的值等于右上角的值 */ }

例:由初始化的第一行填充第二行

天津工程师范学院

9

1 2 2 1 3 4 4 3 5 6 6 5 7 8 8 7 由s控制的第一部分填完。然后是s++,进行第二部分的填充 1 2 3 4

2 1 4 3

3 4 1 2

4 3 2 1

5 6 7 8

6 5 8 7

7 8 5 6

8 7 6 5

最后是第三部分的填充 1 2 3 4 5 6 7 8

⑥这样循环,直到填充完毕,a[][]数组被赋予新值。 3.print()函数

(1)函数功能:将安排好的赛事日程,即二维数组a[n][n-1]输出到屏幕。

天津工程师范学院

10

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 (2)函数主要功能实现:

函数主要运用一个for循环,将二维数组a[n][n-1]输出到屏幕。 for( int i=1;i<=n;i++)//控制行 {

cout<

十.程序运行结果

十一.体会

程序主要运用了:数据输入、函数调用、函数传值、for循环以及二维数组等主要结构和功能。根据分治算法,将本问题进行了由小规模到大规模的求解设计,程序设计的关键点在于如何对问题进行划分和填充公式的归纳。在划分时,主要运用了两个for循环;在填充时,运用了两个for循环。

天津工程师范学院

11

通过这次程序设计,加深了对分治算法的认识。解决具体问题时,程序故重要,但一个好的算法更加重要。

本程序的得意之处在于,经过仔细研究,找到了划分的方法,并推导出了表格填充的两个公式。不足之处也在此,即花费了很长时间来推导这个,对算法掌握还不够熟练。 十二.工具软件及运行环境

1.工具软件:Microsoft Visual C++ 6.0 2.运行环境:Win32 Console Application

天津工程师范学院

12

附:

#include

#include using namespace std;

void print(int n,int a[100][100]); void arrangement(int n,int N,int k,int a[100][100]);

int main() {

int k;

int a[100][100]; int n=1;

cout<<\请输入 k\ cin >> k;

for (int i=1;i<=k;i++) n *= 2;//n=2^k

cout<<\参赛人数\ int N=n;

arrangement(n, N, k, a); print(n,a); }

void arrangement(int n,int N,int k,int a[100][100])

{

for(int i=1;i<=N;i++) {

a[1][i] = i; }

int m =1;

for (int s=1;s<=k;s++) { N/=2; for(int t=1;t<=N;t++) { for(int i=m+1;i<=2*m;i++)

for(int j=m+1;j<=2*m;j++)

{

a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];

a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*

m*2];

} } m *= 2;

}

}

void print(int n,int a[100][100]) {

cout<<\-\循环赛日程表\

cout<

for(int p=1;p

cout<

for( int i=1;i<=n;i++) { cout<

for(int j=2;j<=n;j++) cout<

} }

天津工程师范学院 13

联系客服:779662525#qq.com(#替换为@)