分層填充:從外向內,每層四條邊依次賦值。關鍵變量:
n 當前層號(0 起),m 當前填充值,N 矩陣階數。
每層邊長 = N - 2n。
#define N 5
void main() {
int a[N][N] = {0}, m = 1;
for (int n = 0; n <= N/2; n++) {
for (int j = n; j < N-n; j++) a[n][j] = m++; // 上邊 ←→
for (int i = n+1; i < N-n; i++) a[i][N-n-1] = m++; // 右邊 ↓
for (int j = N-n-2; j >= n; j--) a[N-n-1][j] = m++; // 下邊 →←
for (int i = N-n-2; i > n; i--) a[i][n] = m++; // 左邊 ↑
}
// 輸出矩陣
}
for (int n = 0; n <= N/2; n++) {
for (int j = n; j < N-n; j++) a[j][n] = m++; // 左邊 ↓
for (int i = n+1; i < N-n; i++) a[N-n-1][i] = m++; // 下邊 ←→
for (int j = N-n-2; j >= n; j--) a[j][N-n-1] = m++; // 右邊 ↑
for (int i = N-n-2; i > n; i--) a[n][i] = m++; // 上邊 →←
}
| 邊 | 順時針 | 逆時針 |
|---|---|---|
| 第1邊 | 上:行固定 n,列 n→N-n-1 | 左:列固定 n,行 n→N-n-1 |
| 第2邊 | 右:列固定 N-n-1,行 n+1→N-n-1 | 下:行固定 N-n-1,列 n+1→N-n-1 |
| 第3邊 | 下:行固定 N-n-1,列 N-n-2→n | 右:列固定 N-n-1,行 N-n-2→n |
| 第4邊 | 左:列固定 n,行 N-n-2→n+1 | 上:行固定 n,列 N-n-2→n+1 |
順時針
1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
逆時針
1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9
掌握分層四邊循環不變量,螺旋矩陣問題迎刃而解。