螺旋数组的C语言实现

#include <iostream>
using namespace std;

#define MAX(x,y) (x>y?x:y)
#define ABS(x) (x>0?x:-x)
int SpiralArray(int x, int y)
{
    int floor = MAX(ABS(x), ABS(y));//层数,坐标中最大值即为层数。
    int Result = 0;
    int u = (2 * floor + 1)*(2 * floor + 1);
    if (x == floor)//RIGHT
        Result = u - 7 * x + y;
     if (x ==-floor)//LEFT
        Result = u + 3 * x - y;
     if (y == floor)//DOWN
        Result = u - 5 * y - x;
     if (y == -floor)//UP
        Result = u + y + x;
    return Result;
}

int main()
{
    int n;
    printf("\n\t\t\t\t【螺旋数组】\n");
    printf("\n请输入要求的螺旋数组的维数:");
    scanf_s("%d", &n);
    //这里改变双重循环x,y的顺序和改变从x(y)++(--)的顺序
    //造成螺旋数组的螺旋方向是不同的。
    for (int x = n; x >=-n; x--)
    {
        for (int y=n; y >=-n; y--)
        {
            printf("%5d", SpiralArray(x, y));
        }
        cout << endl;
    }
    printf("\n\n\t\t\t\t\t\t-----coded by 我不是斗哥\n");
    return 0;
}

//=============================总结放最后=====================================
//螺旋数组example:
//  21  22  23  24  25  
//  20   7   8   9  10   
//  19   6   1   2  11
//  18   5   4   3  12
//  17  16  15  14  13
//【1】数组规律突破口:一层一层剥开看,右上角的数总为 u=(2*floor+1)^2
//【2】以第1层为例:取在x,y轴上的四个数(2,4,6,8)为基准
// 则对于右边的那一列的数字,即为基准沿y轴上下移动,上下左同理,即为基准+(-)x(y)
//方向        基准           +(-)x(y)               判断方向的条件     
// 上            u + y                   +x                          y=-floor
// 下            u+3x                    -x                          x=floor
// 左            u-5y                    -y                          x=-floor    
// 右            u-7x                    +y                          y=floor
//【3】但是如【2】的上下左右的公式。计算每一层右上角的数,上和右公式计算出来是不同的。
//这怎么办?
//要注意到上下左右这四个公式在计算每层的四个角的时候是有重复的
//而恰恰只有右和上计算出来的结果是不一样的,认识到上的公式是正确的。
//因此,可以把上的公式放在最后,这样才能把右计算右上角错误的数覆盖。
//而且要注意这时候不能使用if,else if。否则就不能实现覆盖效果了。
//===========================================================================
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值