求5x5阶螺旋方阵

/**
*    实验题目:
*        求5x5阶螺旋方阵
*    实验目的:
*        掌握数组算法设计
*    实验内容:
*        以下是一个5x5阶螺旋方阵。编写程序,输出该形式的nxn(n<10)阶方阵(顺时针方向旋进)
*           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
*/

#include <stdio.h>

#define MAX_LEN 10

/*------------------求n阶螺旋方阵a-----------------*/
/**
*   螺旋方阵:
*       是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,
*   按顺时针螺旋方向顺序填入N×N的方阵里。
*   以N=5为例
*       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
*   算法思路:
*       用二维数组a存放n阶螺旋方阵。偶数阶螺旋方阵共有m(m=n/2)圈,
*   奇数阶螺旋方阵共有m(m=n/2+1)圈,对于第i(i从0到m-1共执行m次)圈
*   循环,产生该圈上横行的数字,产生该圈右竖行的数字,产生该圈下
*   横行的数字,产生该圈左竖行的数字。最后输出该方阵。
*
*/
static void helix_matrix(int a[MAX_LEN][MAX_LEN], int n)
{
    int m; // 圈数
    int i;
    int j;
    int k = 0;

    if(n % 2 == 0) // 偶数阶螺旋方阵
        m = n / 2;
    else // 奇数阶螺旋方阵
        m = n / 2 + 1;
    for(i = 0; i < m; i++)
    {
        // 产生该圈上横行的数字
        for(j = i; j < n - i; j++)
        {
            k++;
            a[i][j] = k;
        }
        // 产生该圈右竖行的数字
        for(j = i + 1; j < n - i; j++)
        {
            k++;
            a[j][n - i - 1] = k;
        }
        // 产生该圈下横行的数字
        for(j = n - i - 2; j >= i; j--)
        {
            k++;
            a[n - i - 1][j] = k;
        }
        // 产生该圈左竖行的数字
        for(j = n - i - 2; j >= i + 1; j--)
        {
            k++;
            a[j][i] = k;
        }
    }
}

int main(void)
{
    int n, i, j;
    int a[MAX_LEN][MAX_LEN];

    printf("输入n(n<10):");
    scanf("%d", &n);
    helix_matrix(a, n);
    printf("%d阶数字方阵如下:\n", n);

    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}
测试结果:

输入n(n<10):5
5阶数字方阵如下:
   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

  • 12
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值