You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:修复逐层填充的原有逻辑

你最初设想的「从外到内逐层填边框」的思路是完全可行的,只需要调整循环结构避免覆盖和越界即可:

  1. 先计算方阵总边长s = 2*n - 1
  2. 外层循环控制当前填充的层数:初始填充最外层,对应数字为n,每向内推进一层,要填充的数字减1,直到填到中心数字1为止
  3. 对每一层要填充的数字k,先计算该层对应的四条边界位置:上边界行号、下边界行号、左边界列号、右边界列号,边界位置和k的对应关系可以自己用n=4的例子推导
  4. 给当前层四条边界上的所有位置统一赋值为k即可,由于内层的边界完全在外层边界的范围内,填充内层时不会覆盖外层已经写好的数值。

内容的提问来源于stack exchange,提问作者Soham Jobanputra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:18:27