【数据结构与算法分析】蛇形阵:一字阵和回形阵(螺旋阵)的原理及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
原创粉丝点击