【数据结构与算法分析】蛇形阵:一字阵和回形阵(螺旋阵)的原理及C实现
来源:互联网 发布:漂亮的注册页面源码 编辑:程序博客网 时间:2024/05/22 08:07
一字阵
是指将数字按大小顺序相连后,形成首尾相连的一字形的矩阵
常见形式
斜线型
1 2 6
3 5 7
4 8 9
分析思路
0 1 2
0 1 2 6
1 3 5 7
2 4 8 9
整个矩阵关于对角线对称分为上三角和下三角。则可以先构造上三角(包括斜线),再构造下三角。
如果以斜线划分,如(1)(2,3)(4,5,6)(7,8)(9),则每条斜线都有一个最大值和最小值。就可以定义变量num,从1开始递增,将num填入相应的位置。因此,我们可以找每条斜线的最小值,从最小值开始在斜线上填入num。相当于用笔从1开始按顺序连接矩阵。
难点在于如何根据矩阵的大小来确定每个点的行列关系,并递增或递减。我是通过纸笔分析得到的行列关系,然后手工模拟找出问题。具体关系在代码的注释中。
横线型
1 2 3
6 5 4
7 8 9
分析思路
横线型比斜线型简单,只需要通过判断行的奇偶性来控制循环变量,来填入num。
代码实现
斜线型
<pre name="code" class="cpp">#include<stdio.h>int main(){ int n,num,matrix[30][30]; int i,j; while(scanf("%d",&n)>0) { num=0; //遍历连接上三角的斜线,包括对角线 for(i=0; i<n; ++i) { if(i%2==0) //则最小值在下面 { for(j=i; j>=0; --j) //上三角第i条斜线有i个点 matrix[j][i-j]=++num; //有i个点所以行递减i次,每个点的行列相加等于i所以列=i-行 } else //否则最小值在上面 { for(j=0; j<=i; ++j) //和最小值在下面类似 matrix[j][i-j]=++num; } } //遍历连接下三角的斜线,比上三角复杂 for(i=n-2; i>=0; --i) //为了通过每条斜线的点数i控制行列关系所以递减i { if(i%2==0) //则最小值在下面 { int tem=n; //最小值在下面用tem控制行递减 for(j=n-1-i; j<n; ++j) //列等于总列数减去该斜线的总点数i,减一是为了对应0 matrix[--tem][j]=++num; } else //否则最小值在上面 { int tem=n; //同上 for(j=n-1-i; j<n; ++j) matrix[j][--tem]=++num; } } //输出蛇形阵 for(i=0; i<n; ++i) { for(j=0; j<n; ++j) printf("%4d",matrix[i][j]); printf("\n"); } } return 0;}
运行
横线型
#include<stdio.h>int main(){ int n,num,matrix[30][30]; while(scanf("%d",&n)>0) { num=0; //构造一字阵 for(int i=0; i<n; ++i) //行递增 if(i%2==0) //如果为偶行,则列递增 for(int j=0; j<n; ++j) matrix[i][j]=++num; else //如果为奇行,则列递减 for(int j=n-1; j>=0; --j) matrix[i][j]=++num; //输出一字阵 for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) printf("%4d",matrix[i][j]); printf("\n"); } } return 0;}
运行
回字阵(螺旋阵)
是指将数字按大小顺序相连后,形成回字形(螺旋形)形状的矩阵
我是通过圈数i来控制循环变量,每次循环都填入一个圈的点。圈数:(n+1)/2
常见形式
收缩型
1 2 3
8 9 4
7 6 5
分析思路
按圈从外到里填数的话,按右→下→左→上的顺序填入num。具体实现和循环控制在代码注释中。
扩张型
7 6 5
8 1 4
9 2 3
分析思路
按圈从里到外填数的话,按右→上→左→下的顺序填入num。具体实现和循环控制在代码注释中。
代码实现
收缩型
#include<stdio.h>int main(){ int n,num,matrix[30][30]; int i,j; while(scanf("%d",&n)>0) { int tem=n-1; num=0; //构造螺旋阵 for(i=0; i<(n+1)/2; ++i) //按圈控制循环 { int R,C; //起始点的坐标 R=C=i; for(j=0; j<tem; ++j) //右 matrix[R][C++]=++num; for(j=0; j<tem; ++j) //下 matrix[R++][C]=++num; for(j=0; j<tem; ++j) //左 matrix[R][C--]=++num; for(j=0; j<tem; ++j) //上 matrix[R--][C]=++num; tem-=2; } if(n%2!=0) //如果n为奇数,则中心需要额外填入 matrix[(n-1)/2][(n-1)/2]=++num; //输出螺旋阵 for(i=0; i<n; ++i) { for(j=0; j<n; ++j) printf("%4d",matrix[i][j]); printf("\n"); } } return 0;}
运行
扩张型(奇数的矩阵好实现一点)
#include<stdio.h>int main(){ int n,num,matrix[30][30]; int i,j; while(scanf("%d",&n)>0) { //构造回形阵 matrix[(n-1)/2][(n-1)/2]=num=1; //填入1 for(i=2; i<=(n+1)/2; ++i) //按圈填数 { int row,column; int R=row=(n-3)/2+i,C=column=n-row; for(j=column; j<=row; ++j) //右 matrix[R][C++]=++num; C-=1; for(j=column; j<=row; ++j) //上 matrix[--R][C]=++num; for(j=column; j<=row; ++j) //左 matrix[R][--C]=++num; for(j=column; j<=row; ++j) //下 matrix[++R][C]=++num; } for(i=0; i<n; ++i) //输出螺旋阵 { for(j=0; j<n; ++j) printf("%4d",matrix[i][j]); printf("\n"); } } return 0;}
运行
1 0
- 【数据结构与算法分析】蛇形阵:一字阵和回形阵(螺旋阵)的原理及C实现
- 数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现
- 《数据结构与算法分析》—栈的链表和数组实现(C语言)
- 一类螺旋方阵问题的算法分析与实现
- 数据结构与算法分析 C语言描述 单链表的实现
- 数据结构与算法:红黑树的原理分析
- 数据结构和算法分析c++:向量的实现
- 数据结构和算法系列 - geohash算法原理及实现方式
- AVL(Adelson-Velskii和Landis)树 - C语言实现(摘自数据结构与算法分析 C语言描述)
- AVL(Adelson-Velskii和Landis)树 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 数据结构与算法分析c++:栈的应用(1)
- 数据结构与算法分析c++:栈的应用(2)
- 数据结构与算法分析c++:栈的应用(3)
- 数据结构与算法分析-队列的实现
- 数据结构与算法分析-栈的实现
- 数据结构与算法分析(C)1.4
- 排序-c语言实现(摘自数据结构与算法分析c语言实现)
- 数据结构与算法分析c++:算法分析
- Redis的数据类型及命令行操作
- 318. Maximum Product of Word Lengths
- linux下利用mentohust校园拨号上网小记
- 税与纳税
- Java 学习笔记(0x0A) 对象转型
- 【数据结构与算法分析】蛇形阵:一字阵和回形阵(螺旋阵)的原理及C实现
- 一道算法题,(位运算)
- bzoj1265-[AHOI2006]斐波卡契的兔子
- 程序设计 小总结
- 构造方法
- JAVA对象初步认识 课堂随笔
- 服务端笔试1-wps
- Jqueryajax简单模拟股票涨跌
- 简单的鱼群AI