目录
一、概念
蛇形矩阵长这样:
1 | 2 | 6 | 7 |
3 | 5 | 8 | 13 |
4 | 9 | 12 | 14 |
10 | 11 | 15 | 16 |
很明显,其赋值原理为下图:
确实像一条伺机而动的蛇~我们来看看如何才能做到如此这般的赋值吧
二、思路
1.更大的可能
很明显,如果单纯按照上图的方向赋值那太容易把人转晕了,因为要考虑的转向太多了
我们不如跳出框框,来看看周围更大的可能:
这样,除了正常“前进”(↗/↙),要考虑的转向其实只有四种:触顶,左端,触底,右端
很明显,我们可以通过二维数组的行(i)和列(j)来判断是这四种转向中的哪一种
值得注意的是,蛇“前进”的方向有两种,这决定了我们是{i-- ; j++}(↗)还是{j-- ; i++}(↙)
所以我们再定义一个flag,来决定蛇的方向
2.四种转向
(1)右端
当j >= n时(其实j == n就行了,因为我们会在j>n之前将j扳回来),我们说蛇触到右端了,而每次蛇都是以↗的方向触到右端,要转向到↙,所以右端的判定及操作为:(我们定义flag == 1时朝向↙)
if (n == j) { j--; i += 2; flag = 1; }
(2)触顶
很明显,当i<0时,蛇就是“触顶”了,但需要注意:当n为奇数时会出现这种情况:
这是“触顶”还是“右端”呢?实际上是右端,因为右端需要跨越两个“空白格”,所以右端的权柄更大,因此我们判定右上角为右端
而与右端同样,触顶也是从↗(0 == flag)到↙(flag = 1),所以触顶的判定及操作如下:
if (i < 0 && j!=n) { i++; flag = 1; }
(3)触底
与右端相似,触底需要经过两个空白格,所以权柄很大,我们考虑时只用判断i == n就可以了,加上触底时从↙(1 == flag)到↗(flag = 0),所以触底的判定及操作如下:
if (n == i) { i--; j += 2; flag = 0; }
(4)左端
与触顶相似,左端要考虑n为偶数时的左下角问题:
所以左端的判定及操作如下:
if (j < 0 && i!=n) { j++; flag = 0; }
3.两种前进
当flag == 0时我们是↗,反之↙,所以代码如下:
if (i >= 0 && i < n && j >= 0 && j < n)
{//在矩阵内
*(a[i] + j) = count;
count++;
if (0 == flag) { i--; j++; }
else { i++; j--; }
}
三、代码
#include<stdio.h>
//蛇形矩阵遍历赋值
void Serpentine_array(int (*a)[50],int n) {
int count = 1;
int flag = 0;//决定方向
int i = 0, j = 0;
while (!(n-1 == i && n-1 == j)) {
if (i >= 0 && i < n && j >= 0 && j < n)
{//在矩阵内
*(a[i] + j) = count;
count++;
if (0 == flag) { i--; j++; }
else { i++; j--; }
}
if (i < 0 && j!=n) { i++; flag = 1; }//触顶
else if (j < 0 && i!=n) { j++; flag = 0; }//左
else if (n == i) { i--; j += 2; flag = 0; }//触底
else if (n == j) { j--; i += 2; flag = 1; }//右
}
*(a[n - 1] + n - 1) = count;
}
//输出矩阵
void print(int(*a)[50], int n) {
for (int i = 0; i < n; i++) {
int j;
for (j = 0; j < n - 1; j++) {
printf("%03d ", *(a[i] + j));
}
printf("%03d\n", *(a[i] + j));
}
}
int main()
{
int a[50][50],n;
printf("请输入蛇形矩阵边长:");
while (scanf("%d", &n) != EOF) {//允许多组输入
Serpentine_array(a, n);//蛇形矩阵遍历赋值
print(a, n);//输出矩阵
printf("\n要再来一个么?\n0.No 1.Yes\n");
int again;
scanf("%d", &again);
if (again) printf("请输入蛇形矩阵边长:");
else break;
}
return 0;
}
运行结果:
四、感谢观看~
如果觉得对你有帮助的话,请点赞+关注,谢谢!
冬码农持续努力中~