③用一个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 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<