蛇形填数

本文介绍了一个在n*n方阵中按蛇形路径填充数字的算法实现。通过使用前置递增运算符来避免数组越界问题,并确保填充过程的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例:在n*n的方阵中 填入 1,2.....n*n,要求填成蛇形。例如2*2矩阵:

4 1

3 2

实现:

#include<stdio.h>
#include<string.h>
#define max 30
int a[max][max];
int main()
	{
		int n;
		memset(a,0,sizeof(a));
//		freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);
//		freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout);
		scanf("%d",&n);	 
		int cnt = 1;
		a[0][n-1] = 1;//下面循环解决不了第一个数
		int i = 0, j = n-1;
		while(cnt < n*n){//以4*4为例 当 ++cnt == 15时候 满足条件 进入 循环 因为 内部是 ++cnt == 16 故 此时就不满足循环了 刚好出来
			while(i + 1 < n && !a[i+1][j]) a[++i][j] = ++cnt;
			while(j-1 >= 0 && !a[i][j-1]) a[i][--j] = ++cnt;//j-1属于预判断因为 j-1 就是后面的[--j] 只有 j-1后满足条件 才可以继续后面
			while(i-1 >= 0 && !a[i-1][j]) a[--i][j] = ++cnt;
			while(j + 1 < n && !a[i][j+1]) a[i][++j] = ++cnt;
 		}
					
		for(int i = 0; i < n; i++ ){
			for(int j = 0; j < n; j++ ){
				printf("%5d",a[i][j]);
			}
			printf("\n");
		}
		return 0;
	}

这题 主要是 对数组中 ++I 与 I++的理解

此题用前置++ 而不用后置++ 因为 后置(i++) (以4*4第一遍的右侧为例)当 I = 3时 a[I++] 后 填上了a[3]后 i变成 4 此时已经越界,并且 这也不便进行预判断 是否 有的位置已经被填充。

而用 前置(++i) 每次都是先进行预判断 后 如果没越界 才可以进入循环 进行填充  这就保证了 不会越界 例如 (以4*4第一遍的右侧为例)当I = 2, 满足2+1 < (n = 4),  a[++i] 也就是 a[3] 填入数字,但是

下一次循环就不再满足, 此时 I的值 仍然为 3 这正是我们期望的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值