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

如何实现从中心开始填充的螺旋数组,现有C#代码应如何调整?

原有代码问题说明

  1. 矩阵尺寸计算逻辑错误:中心起始的螺旋方阵必须为奇数阶才有唯一中心点,你当前的尺寸计算没有做奇数校验,得到的边长可能是偶数。
  2. 中心点坐标计算错误:你定义的midlle = counter - 2不符合奇数阶方阵中心点坐标规则,5阶方阵的正确中心点坐标是(2,2),而你的计算结果得到的坐标完全错位。
  3. 填充逻辑适配错误:你当前写的是从外层往内层填充的逻辑,仅适合从左上角起始的螺旋数组,完全不匹配从中心向外填充的需求。

正确实现思路

中心向外的顺时针螺旋填充采用方向轮换+步长递增逻辑实现最简单:

  • 先确定奇数阶方阵的边长,中心点坐标固定为(n//2, n//2)
  • 定义四个顺时针方向的位移:右(0,1)、下(1,0)、左(0,-1)、上(-1,0)
  • 从中心点开始填充初始值,每走完2个方向步长自增1,沿当前方向逐步填充数值,直到填满整个方阵

修正后可运行代码

// 读取输入值,若要以输入值为起始值,仅需修改count初始值为input即可
int input = int.Parse(Console.ReadLine());
// 确保方阵边长为奇数,偶数输入自动转换为下一个奇数
int n = input % 2 == 0 ? input + 1 : input;
int[,] matrix = new int[n, n];

// 初始化中心点与起始填充值
int x = n / 2;
int y = n / 2;
int count = 1;
matrix[x, y] = count;
count++;

// 顺时针四个方向的行、列位移
int[] dx = { 0, 1, 0, -1 };
int[] dy = { 1, 0, -1, 0 };
int dir = 0; // 当前方向索引
int step = 1; // 当前步长

while (count <= n * n)
{
    // 每走两个方向,步长+1
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < step; j++)
        {
            x += dx[dir];
            y += dy[dir];
            // 越界直接跳出
            if (x < 0 || x >= n || y < 0 || y >= n) break;
            matrix[x, y] = count;
            count++;
            if (count > n * n) break;
        }
        if (count > n * n) break;
        // 切换下一个方向
        dir = (dir + 1) % 4;
    }
    step++;
}

// 格式化对齐输出
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        Console.Write($"{matrix[i, j],-4}");
    }
    Console.WriteLine();
}

输入5运行后,输出结果和你给出的示例完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:36:03