输出螺旋数组(难度:1颗星)

本文介绍了如何输出螺旋矩阵,给出了从方法1到方法5的详细步骤和参考代码,包括静态二维数组、动态分配数组、根据规律缩小边界以及利用边界变量和光标位置的方法。每个方法都旨在适应不同大小的矩阵n值,实现螺旋排列的输出。
摘要由CSDN通过智能技术生成

输入n*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

方法1:
用静态的二维数组保存,到方法2在动态生成,随着n的变化而变化,根据右,下,左,上的顺序,就可以走出一个螺旋数组。

参考代码:

#include <stdio.h>

int arr[100][100], n;//暂时先用静态的二维数组保存,到方法2在动态生成,随着n的变化而变化

enum EmDir
{
    emRight = 1,
    emDown = 2,
    emLeft = 3,
    emUp = 4,
};

int IsRightDirOk(int row, int column)
{
    return (column + 1 < n && 0 == arr[row][column + 1]);
}

int IsDownDirOk(int row, int column)
{
    return (row + 1 < n && 0 == arr[row + 1][column]);
}

int IsLeftDirOk(int row, int column)
{
    return (column - 1 >= 0 && 0 == arr[row][column - 1]);
}

int IsUpDirOk(int row, int column)
{
    return (row - 1 >= 0 && 0 == arr[row - 1][column]);
}

int GetNextStepDir(int curDir, int row, int column)
{
    if (curDir == emRight)
        return IsRightDirOk(row, column) ? emRight : emDown;
    else if (curDir == emDown)
        return IsDownDirOk(row, column) ? emDown : emLeft;
    else if (curDir == emLeft)
        return IsLeftDirOk(row, column) ? emLeft : emUp;
    return IsUpDirOk(row, column) ? emUp : emRight;
}

int main()
{
    int i, j, row = 0, column = 0, nCount = 1, curDir = (int)emRight;
    printf("输入n*n矩阵的n值:");
    scanf_s("%d", &n);
    while (nCount <= n * n)
    {
        arr[row][column] = nCount++;
        curDir = GetNextStepDir(curDir, row, column);
        if (emRight == curDir)
            column++;
        else if (emDown == curDir)
            row++;
        else if (emLeft == curDir)
            column--;
        else
            row--;
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%5d", arr[i][j]);
        printf("\n");
    }
    return 0;
}

方法2:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值