C语言打印同心递减数字方阵图案的实现逻辑求教
数字同心圆方阵打印解题思路
输入整数n,输出边长为2n-1的数字方阵,n=4时的正确输出如下:
4 4 4 4 4 4 4 4 3 3 3 3 3 4 4 3 2 2 2 3 4 4 3 2 1 2 3 4 4 3 2 2 2 3 4 4 3 3 3 3 3 4 4 4 4 4 4 4 4
原有代码的问题
- 数组访问越界:你定义的
f数组长度为n,但后续双层循环中j的取值范围是0到2n-2,访问f[j]时会超出数组合法范围,属于未定义行为,直接导致输出结果错乱。 - 赋值逻辑存在覆盖问题:你没有做分层收敛,循环跑满整个方阵边长时,后写入的数值会反复覆盖之前已经填好的外层值,最终无法得到分层的效果。
- 初始化不完整:代码中仅给方阵中心位置赋了初始值1,其余位置未做初始化,未被正确赋值的位置会输出内存中的随机垃圾值。
可行实现思路
思路1:坐标规律直接计算法(无需预存二维数组)
观察图案规律可以发现,方阵中任意坐标(i,j)(行、列下标均从0开始计算)的数值,只和该位置到方阵四条边界的最小距离有关:
- 到上边界的距离:
i - 到下边界的距离:
(2n-2) - i - 到左边界的距离:
j - 到右边界的距离:
(2n-2) - j
取上述四个值的最小值,用n减去这个最小值,就是当前位置需要打印的数字。
这个方案不需要提前开辟二维数组存储所有位置的值,遍历每个坐标时直接计算、直接打印即可,内存占用最低,逻辑也最简洁。
思路2:修复逐层填充的原有逻辑
你最初设想的「从外到内逐层填边框」的思路是完全可行的,只需要调整循环结构避免覆盖和越界即可:
- 先计算方阵总边长
s = 2*n - 1 - 外层循环控制当前填充的层数:初始填充最外层,对应数字为n,每向内推进一层,要填充的数字减1,直到填到中心数字1为止
- 对每一层要填充的数字k,先计算该层对应的四条边界位置:上边界行号、下边界行号、左边界列号、右边界列号,边界位置和k的对应关系可以自己用n=4的例子推导
- 给当前层四条边界上的所有位置统一赋值为k即可,由于内层的边界完全在外层边界的范围内,填充内层时不会覆盖外层已经写好的数值。
内容的提问来源于stack exchange,提问作者Soham Jobanputra
相关产品推荐
相关产品推荐

