C语言:蛇形矩阵

目录

一、概念

二、思路

1.更大的可能

2.四种转向

(1)右端

(2)触顶

(3)触底

(4)左端

3.两种前进

三、代码

四、感谢观看~


一、概念

蛇形矩阵长这样:

1267
35813
491214
10111516

很明显,其赋值原理为下图:

确实像一条伺机而动的蛇~我们来看看如何才能做到如此这般的赋值吧

二、思路

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;
}

运行结果:

四、感谢观看~

如果觉得对你有帮助的话,请点赞+关注,谢谢!

冬码农持续努力中~

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬有雪的学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值