学习目标:
-
理解分治法的设计思想: 分治法是一种递归算法,它将问题分解成若干个规模较小的相同问题,递归地解决这些子问题,然后再合并这些子问题的解以得到原问题的解。
-
掌握数字旋转方阵的实现过程: 数字旋转方阵的填充过程通常从方阵的中心开始,向四周扩散填充数字。如果方阵的阶数是奇数,则中心只有一个数字;如果是偶数,则中心是一个小方阵。填充时,按照顺时针方向,先填充上行,再填充右列,然后填充下行(从右向左),最后填充左列(从下向上)。
-
熟练掌握二维数组的使用方法: 二维数组是一种基本的数据结构,用于表示表格或矩阵。在C语言中,二维数组可以通过
array[row][column]
的方式来访问和修改元素。 -
编程实现数字旋转方阵: 编程实现时,可以使用递归函数来填充数字旋转方阵。递归函数应该接收当前填充的数字、起始位置和方阵的阶数作为参数。
简介
输出一个n∗n的数字方阵,方阵样式如下所示
4 //输入的方阵大小
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
数字旋转方阵是一种有趣的数学游戏,也被称为“魔方阵”。它是由数字组成的方阵,其中每个数字都只出现一次,且每一行、每一列以及两条对角线上的数字之和都相等。
数字旋转方阵有多种类型,其中最常见的是3阶、4阶和5阶方阵。例如,一个3阶数字旋转方阵可以由数字1到9组成,每个数字只出现一次,且每一行、每一列以及两条对角线上的数字之和都相等。
数字旋转方阵的解决方法有多种,其中一种常用的方法是“循环填充法”。具体步骤如下:
1. 选择一个合适的起始点,例如在3阶方阵中选择中间的格子。
2. 从1开始,按照顺时针方向填充数字,直到填满整个方阵。
3. 如果在填充过程中遇到已经填充的格子,则跳过该格子并继续填充下一个格子。
4. 重复步骤2和3,直到填满整个方阵。
数字旋转方阵是一种有趣的数学问题,它可以锻炼人们的逻辑思维能力和空间想象力。此外,数字旋转方阵在计算机科学、密码学等领域也有一定的应用价值。
算法伪代码
函数 FULL(number, begin, size)
如果 size 等于 0
打印 "error!"
结束函数
如果 size 等于 1
b[begin][begin] 设为 number
结束函数设 i 为 begin
设 j 为 begin
对 k 从 0 到 size - 1
b[i][j] 设为 number
number 增加 1
i 增加 1
对 k 从 0 到 size - 1
b[i][j] 设为 number
number 增加 1
j 增加 1
对 k 从 0 到 size - 1
b[i][j] 设为 number
number 增加 1
i 减少 1
对 k 从 0 到 size - 1
b[i][j] 设为 number
number 增加 1
j 减少 1调用 FULL(number, begin + 1, size - 2)
主程序
设 number 为 1
设 i, j, begin 为 0
调用 FULL(number, begin, size)
对 i 从 0 到 N - 1
对 j 从 0 到 N - 1
打印 b[i][j] 的值,右对齐,宽度为 2
打印换行
暂停程序
结束程序
算法代码:
#include<stdio.h> #define N 5 int size=N,b[N][N]; void FULL(int number,int begin,int size){ int i,j,k; if(size==0) printf("error!");//return ; if(size==1){b[begin][begin]=number;b[begin][begin]=number;//return;} i=begin; j=begin; for(k=0;k<size-1;k++){ b[i][j]=number; number++; i++; } for(k=0;k<size-1;k++){ b[i][j]=number; number++; j++; } for(k=0;k<size-1;k++){ b[i][j]=number; number++; i--; } for(k=0;k<size-1;k++){ b[i][j]=number; number++; j--; } FULL(number,begin+1,size-2); } int main(){ int number=1; int i,j,begin=0; FULL(number,begin,size); for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("%2d ",b[i][j]); } printf("\n"); } system("pause"); return 0; }