zoukankan      html  css  js  c++  java
  • C语言编程如何实现输出一个回型递增的N阶矩阵(螺旋矩阵)

    首先,说到输出矩阵无论什么水平的人都会认为使用数组最为方便,所以这里说明的是利用多维数组的实现。

    首先是算法需要的变量定义

    int i,j,n,sum;
    printf("请输入矩阵的行列长度:
    ");
    scanf("%d",&n);
    int juzhen[n][n];
    memset(juzhen,0,sizeof(juzhen));
    sum=1;

    其次就是核心算法,此程序核心在于如何写入元素到定义的数组中,要实现回型的数据递增,就必须使用不同的方法的输入不同方向递增的数据;

    还有这里要注意数组的定义,是从0号下标开始填入元素(当然从下标为一的元素开始也是可以的,此方法类似不予说明);

    另外在换方向输入的时候还要注意前一方向已经输入数据的数组元素不能再输入,于是使用if语句以区分是否填充过数据(这里需要提前将数组全部置零,使用了memset函数,此函数需要头文件string.h)。

    这里定义了for语句实现的四种方向的输入

    for(i=0;i<n/2;i++)
       {
         for(j=0;j<n-1;j++)//向右
            {
                if(juzhen[i][j]==0)
                juzhen[i][j]=sum++;
            }
            for(j=i;j<n-1;j++)//向下
            {
                if(juzhen[j][n-1-i]==0)
                    juzhen[j][n-1-i]=sum++;
            }
            for(j=n-i-1;j>i;j--)//向左
            {
                if(juzhen[n-1-i][j]==0)
                juzhen[n-1-i][j]=sum++;
            }
            for(j=n-1-i;j>i;j--)//向上
            {
                if(juzhen[j][i]==0)
                    juzhen[j][i]=sum++;
            }

    最后在对输入的数字做区分,当N阶矩阵是一个偶数阶的矩阵时没有矩阵中心元素,但是奇数阶矩阵有,语句如下

    if(n%2==1)
            juzhen[(n-1)/2][(n-1)/2]=sum++;

    最后对数组进行输出

    for(i=0;i<=n-1;i++)
        for(j=0;j<=n-1;j++)
            {
                printf("%4d",juzhen[i][j]);
                if(j==n-1)
                    printf("
    ");
            }
    完整源代码如下
    ```
    
    #include<string.h>

    #include<stdio.h>

    int main()
    {
    int i,j,n,sum;
    printf("请输入矩阵的行列长度: ");
    scanf("%d",&n);
    int juzhen[n][n];
    memset(juzhen,0,sizeof(juzhen));
    sum=1;

    for(i=0;i<n/2;i++)
    {
      for(j=0;j<n-1;j++)//向右
        {
            if(juzhen[i][j]==0)
            juzhen[i][j]=sum++;
        }
        for(j=i;j<n-1;j++)//向下
        {
            if(juzhen[j][n-1-i]==0)
                juzhen[j][n-1-i]=sum++;
        }
        for(j=n-i-1;j>i;j--)//向左
        {
            if(juzhen[n-1-i][j]==0)
            juzhen[n-1-i][j]=sum++;
        }
        for(j=n-1-i;j>i;j--)//向上
        {
            if(juzhen[j][i]==0)
                juzhen[j][i]=sum++;
        }
    
    }
            if(n%2==1)
            juzhen[(n-1)/2][(n-1)/2]=sum++;
    
    for(i=0;i<=n-1;i++)
    for(j=0;j<=n-1;j++)
        {
            printf("%4d",juzhen[i][j]);
            if(j==n-1)
                printf("
    ");
        }

    }

  • 相关阅读:
    POJ 1182 食物链(带权并查集)
    UVa 10655 n次方之和(矩阵快速幂)
    2016湘潭邀请赛—Heartstone
    2016湘潭邀请赛—Gambling
    UVa 10375 选择与除法(唯一分解定理)
    UVa 1637 纸牌游戏(全概率公式)
    POJ 2443 Set Operation(压位加速)
    UVa 11248 网络扩容(最大流(需要优化))
    51Nod 1737 配对(树的重心)
    51Nod 1070 Bash游戏 V4(斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13756284.html
Copyright © 2011-2022 走看看