for (j = n+i-1; j >= i+1; j--) a[i][j] = k++; // 起始索引錯誤
printf("%d ", a[i][j]); // 無寬度,輸出擠在一起
n-i+1,而非 n+i-1,導致越界或重疊。for (i = 1; i <= n/2; i++) {
// 向下:左欄
for (j = i; j <= n-i; j++) a[j][i] = k++;
// 向右:底行
for (j = i; j <= n-i; j++) a[n-i+1][j] = k++;
// 向上:右欄
for (j = n-i+1; j >= i+1; j--) a[j][n-i+1] = k++;
// 向左:頂行 (修正起始點)
for (j = n-i+1; j >= i+1; j--) a[i][j] = k++;
}
// 輸出固定寬度
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) printf("%2d ", a[i][j]);
printf("\n");
}
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
符合題目要求的順時針內捲螺旋。
a[0..n-1][0..n-1]) 符合 C 慣例,邊界條件更直觀。void spiral(int n, int a[][MAX]),主程式只負責 I/O。k。掌握「四邊界收縮」模式,可輕鬆擴展至任意 N×N 螺旋矩陣生成。