关于C语言螺旋填充N阶方阵时方向数组顺序的技术问询
螺旋方阵填充问题:方向数组解析与代码修复
咱们一步步拆解你的问题,先搞清楚方向数组的设计逻辑,再找出代码输出不符合预期的核心原因。
一、为什么方向数组的第一个元素是{0, 1}?
首先明确坐标规则:这里x代表行索引,y代表列索引,map[x][y]对应第x行第y列的元素。
题目要求的填充顺序是「左到右→向下→右到左→向上」,对应坐标变化逻辑:
- 左到右:行不动,列依次增加 →
x不变,y+1→ 对应方向{0, 1} - 向下:列不动,行依次增加 →
x+1,y不变 → 对应方向{1, 0} - 右到左:行不动,列依次减少 →
x不变,y-1→ 对应方向{0, -1} - 向上:列不动,行依次减少 →
x-1,y不变 → 对应方向{-1, 0}
你设想的方向顺序是反向的,会导致填充逻辑完全颠倒,不符合题目要求。所以原代码里的方向数组顺序是完全正确的。
二、你的代码输出异常的核心原因
看你的输出结果,中间层元素被覆盖成1、2、3、4,这是因为**number的初始化位置错误**:你把int number = 1;放在了层循环for (layer=0; ...)内部,导致每处理一层,计数就从1重新开始,直接覆盖了内层已填充的数值。
除此之外,赋值和移动的顺序混乱,导致初始点被重复赋值,进一步加剧了数值覆盖问题。
三、修复后的代码
下面是修正后的代码,我调整了number的位置,同时优化了赋值逻辑,避免重复赋值:
#include <stdio.h> #define N 4 int main(void){ int map[N][N]; // 方向数组顺序正确,对应左到右→向下→右到左→向上 int dirs[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} }; int number = 1; // 计数变量移到层循环外,保证全局递增 for (int layer=0; layer < (N+1)/2; layer++){ int x = layer, y = layer; int current_len = N - layer * 2; // 当前层的边长 // 处理奇数N的最内层单个元素 if (current_len == 1) { map[x][y] = number; break; } // 先给当前层起点赋值 map[x][y] = number++; // 遍历四个方向填充当前层 for (int dir=0; dir < 4; dir ++){ // 最后一个方向(向上)少走一步,避免回到起点重复赋值 int steps = (dir == 3) ? current_len - 2 : current_len - 1; for (int i=0; i < steps; i++){ // 先移动到下一个位置,再赋值 x += dirs[dir][0]; y += dirs[dir][1]; map[x][y] = number++; } } } // 打印结果 printf("Final map is: \n"); for (int i = 0; i < N; i++){ for (int j = 0; j < N; j++){ printf("%4d ", map[i][j]); } printf("\n"); } return 0; }
四、修复后的输出
运行修正后的代码,N=4时的正确输出为:
Final map is: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
完全符合螺旋填充的预期逻辑。
内容的提问来源于stack exchange,提问作者Jorge Ávila Balmaceda
相关产品推荐
相关产品推荐

