题目描述 - Read.DOC
文本预览下载声明
螺旋矩阵实验报告
题目描述:
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 );
显示全部