如何实现从中心开始填充的螺旋数组,现有C#代码应如何调整?
原有代码问题说明
- 矩阵尺寸计算逻辑错误:中心起始的螺旋方阵必须为奇数阶才有唯一中心点,你当前的尺寸计算没有做奇数校验,得到的边长可能是偶数。
- 中心点坐标计算错误:你定义的
midlle = counter - 2不符合奇数阶方阵中心点坐标规则,5阶方阵的正确中心点坐标是(2,2),而你的计算结果得到的坐标完全错位。 - 填充逻辑适配错误:你当前写的是从外层往内层填充的逻辑,仅适合从左上角起始的螺旋数组,完全不匹配从中心向外填充的需求。
正确实现思路
中心向外的顺时针螺旋填充采用方向轮换+步长递增逻辑实现最简单:
- 先确定奇数阶方阵的边长,中心点坐标固定为
(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
相关产品推荐
相关产品推荐

