#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。否则就不能实现覆盖效果了。
//===========================================================================
螺旋数组的C语言实现
最新推荐文章于 2022-07-06 15:29:00 发布