日期:2023-11-21
一:个人对于螺旋矩阵的理解和一些构思:
(1)螺旋矩阵由于其不定数量的行列性质,通过一般的数学逻辑套用循环与判断设计思路无法满足程序设计的需求,所以应该是外循环针对行列数,内循环进行赋值和特性增写,从而在满足不定数量的行与列条件下,实现数据的螺旋录入,并正常的输出。
(2)内循环对于矩阵数组的理解尤为关键,从数学逻辑上划分,螺旋矩阵的特性决定了它不是由单一的限制特定行或是特定列再加以特殊位置的数据录入可以实现的,所以对于这类问题,只能层层剖析,通过逐层剥离矩阵元素来实现数据叠加和螺旋排列的特性。
(3)从函数角度的些许想法:通过判断下位元素同原来元素的大小关系,结合该不定矩阵的最大行列数书写特定函数,从而生成上下左右具有不同功能的局部函数,利用不返回特定值的功能函数结合递归函数,生成总和上下左右排列的综合性功能函数,来实现矩阵的特定螺旋排列的特性和值的递增排列。
二:代码(包含了些设计时的个人想法和注释)
方法一:数学分析法:深度挖掘螺旋矩阵的内层数学逻辑,并通过循环逐层剖析矩阵内涵,实现特定位置的排序。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n, a[10][10];
int m = 1;
int c = 0;
int b;
int i, j;
scanf("%d", &n);
b = n - 1;
//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
while (c <= b)//对于循环条件的控制,选择相同的控制相对的两边,考虑下变化的处理方式
{
for (i = c; i <= b; i++)//上边
{
a[c][i] = m++;
}
for (i = c + 1; i <= b; i++)//右边
{
a[i][b] = m++;
}
for (i = b-1; i >= c; i--)//下边
{
a[b][i] = m++;
}
for (i = b - 1; i >= c + 1; i--)//左边
{
a[i][c] = m++;
}
c++;
b--;//完成缩圈操作
}
for (j = 0; j < n; j++)
{
for (i = 0; i < n; i++)
{
printf("%3d", a[j][i]);
}
printf("\n");
}
return 0;
}
方法二:函数法:调用功能性函数实现下位数组元素的特定排列,综合性强,效率高,但需在充分理解螺旋矩阵的数学内核和程序调用特性的条件下才能准确写出,下方代码只是部分思路,并未完全完善函数打印功能的特性。
#include<stdio.h>
#define MAX 9
void LeftSwap(int a[], int Left, int i)
{
int Tag, j;
Tag = a[i];
for (j = i; j > Left; j--)
a[j] = a[j - 1];
a[Left] = Tag;
}
void RightSwap(int a[], int Left, int i)
{
int Tag, j;
Tag = a[Left];
for (j = Left; j < i; j++)
a[j] = a[j + 1];
a[i] = Tag;
}
void Array(int a[], int Left, int Right)
{
int i;
if (Left == Right)
{
for (i = 0; i <= Right; i++)
printf("%d", a[i]);
printf("\n");
}
else
{
for (i = Left; i <= Right; i++)
{
LeftSwap(a, Left, i);
Array(a, Left + 1, Right);
RightSwap(a, Left, i);
}
}
}
int main()
{
int n, a[MAX];
scanf("%d", &n);
int i;
for (i = 0; i < n; i++)
{
a[i] = i + 1;
}
Array(a, 0, n - 1);
return 0;
}