基于单个整数的螺旋图案打印代码方向逻辑错误排查求助
修复螺旋序列生成的方向控制与边界问题
我帮你排查出两个关键问题,导致了方向控制异常和序列生成错误:
问题1:重复的方向切换逻辑
你在每个方向分支里已经手动设置了dir(比如dir=1、dir=2),但在while循环末尾又额外执行了dir=(dir+1)%4;——这相当于每次处理完一个方向后,方向被切换了两次。比如:
- 处理完
dir=0后,你设置dir=1,然后又执行dir=(1+1)%4=2,直接跳过了dir=1的处理逻辑 - 这种重复切换最终导致方向逻辑彻底混乱,出现你看到的异常循环
问题2:循环边界不完整
你的for循环使用了<或>作为边界条件,比如for(i=l;i<r;i++),这会导致每一边少填充一个元素。以n=4的最外层上边为例,应该填充7个4,但你的代码只会填充6个,最终序列长度和内容都会出错。
修正后的完整代码
#include <stdio.h> int main() { int n; scanf("%d", &n); int x = n + (n - 1); int size = x * x; int t, b, l, r; t = 0; l = 0; b = x - 1; r = x - 1; int i; int res[size]; int index = 0; int dir = 0; while(t <= b && l <= r){ if(dir == 0){ // 从左到右填充顶部行 for(i = l; i <= r; i++){ res[index] = n; index++; } t++; dir = 1; } else if (dir == 1) { // 从上到下填充右侧列 for(i = t; i <= b; i++){ res[index] = n; index++; } r--; dir = 2; } else if (dir == 2) { // 从右到左填充底部行 for(i = r; i >= l; i--){ res[index] = n; index++; } b--; dir = 3; } else if(dir == 3){ // 从下到上填充左侧列 for(i = b; i >= t; i--){ res[index] = n; index++; } l++; dir = 0; } n--; // 移除了多余的dir=(dir+1)%4; } // 打印生成的螺旋序列 for(i = 0; i < size; i++){ printf("%d ", res[i]); } printf("\n"); return 0; }
关键改动说明
- 移除重复的方向切换:删掉了
while循环末尾的dir=(dir+1)%4;,现在每个分支的方向切换完全由手动设置的dir=1/2/3/0控制,逻辑清晰且符合预期的0→1→2→3循环。 - 修正循环边界:把所有
for循环的<改为<=,>改为>=,确保每一边的所有元素都被正确填充。 - 添加序列打印逻辑:补充了完整的打印代码,方便你直接验证生成的序列是否符合要求。
当输入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。
内容的提问来源于stack exchange,提问作者vikashV3
相关产品推荐
相关产品推荐

