文档详情

题目描述 - Read.DOC

发布:2017-07-31约3.8千字共10页下载文档
文本预览下载声明
螺旋矩阵实验报告 题目描述: C语言作业 将螺旋方阵存放在N*N的二维数组中,并把它打印输出,要求程序自动生成螺旋方阵(而非人为初始化逐个赋值) 实验目的及要求: 实验步骤(流程图): 算法描述: 螺旋方阵实例如下: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 由上述实例直观可知,以顺时针方向从外围开始递增的填充映射矩阵, 每填充一个外围 , 问题即被分解为与此相同更小的问题,重复的从外围填充相应子矩阵,即可完成. 递归解法: 设原问题为 “ n 阶的螺旋方阵 , 起始值为 n_s , 终止值为 N*N , 则映射矩阵也为n 阶的矩阵 , 起始行为 row_s , 起始列维 col_s “. 递归开始: 第一步: 从映射矩阵的第一行开始开始向右填充n 个螺旋方阵中的值(从传入的起始值开始 , 值递增变化) 第二步: 从映射矩阵的最后一列第二行开始向下填充 n-1 个螺旋方阵中的值(值递增变化) 第三步: 从映射矩阵的最后一行最后一列开始向左填充 n-1 个螺旋方阵中的值(值递增变化) 第四步: 从映射矩阵的倒数第二行第一列开始向左填充 n-2 个螺旋方阵中的值(值递增变化) 此时映射矩阵的最外围被填充完毕 , 原问题转化为 “ n-2 阶的螺旋方阵 , 最小值为 n_s(一直递增变化) , 最大值为 N*N , 则映射矩阵也为n-2 阶的矩阵 , 起始行为 row_s+1 , 起始列为 col_s+1 “ 的子问题 , 用此解法递归的解决子问题 , 直到传入的螺旋矩阵起始值大于等于终止值时 , 递归调用结束 , 函数退出 , 问题解决 . 预测结果 : N = 4的情况 (初始值均赋为0) 第一次遍历结果: 1 2 3 4 12 0 0 5 11 0 0 6 10 9 8 7 第二次遍历结果: 1 2 3 4 12 13 14 5 11 15 16 6 10 9 8 7 最终结果: 1 2 3 4 12 13 14 5 11 15 16 6 10 9 8 7 实验内容(程序): # include stdio.h # include stdlib.h /* 参数说明 * N , 螺旋方阵的最大阶数 * n , 映射子矩阵的阶数 * n_s , 递归遍历螺旋矩阵时,当前计数的值 * arr , 映射矩阵 * row_s , 本次遍历 , 映射矩阵的开始行 * col_s , 本次遍历 , 映射矩阵的开始列 * 无返回值 , 递归遍历 */ void SortArr( int N , int n , int n_s , int ** arr , int row_s , int col_s ); /* 参数说明 * n , n 阶矩阵的阶数 * arr , 欲打印的 n 阶矩阵 */ void PrintArr( int n , int ** arr ); int main( int argc , char * argv[] ) { int N ; /* 螺旋方阵的阶数*/ int ** arr ; /* 映射矩阵 */ printf(Input (N必须大于0) N=); scanf(%d,N); /* 为映射矩阵的存储分配空间 */ arr = (int **)malloc(N*sizeof(int *)); for( int i = 0 ; i N ; i++ ) { arr[i] = (int *)malloc(N*sizeof(int)); } /* 为映射矩阵的存储分配空间 */ for( int i = 0 ; i N ; i++ ) for( int j = 0 ; j N ; j++ ) arr[i][j] = 0 ; /* 递归遍历螺旋方阵填充映射矩阵 */ SortArr( N , N , 1 , arr , 0 , 0 ); /* 打印映射矩阵 */ PrintArr( N , arr );
显示全部
相似文档