蛇形方阵(S形旋转)

· · 算法·理论

蛇形方阵

前情提要:顺时针、逆时针旋转

所谓 S 字形,就是要像 S 一样去走
S 字形也有很多走法,我在这里列举一个: 那它的原理是什么呢?其实就是在向某个方向运动时只运动一次(就是将一些地方的 while 换成 if

S形蛇形方阵的种类

S形蛇形方阵有很多种类,有正 S、反 S、偶数列向下填充、奇数列向下填充(其实还有斜的,但是这篇文章不讲)。
打个比方:上面给出的图片就是一个典型的反 S

S

所谓正 S,就是按照正 S 的方向去填数。

效果
  4  3  2  1
  5  6  7  8
 12 11 10  9
 13 14 15 16
代码
int x = 1, y = n + 1, cnt = 0;
while (cnt < n * n) {
    while (a[x][y - 1] == 0 && y - 1 >= 1)
        a[x][--y] = ++cnt;
    if (a[x - 1][y] == 0 && x - 1 >= 1)
        a[--x][y] = ++cnt;
    while (a[x][y + 1] == 0 && y + 1 <= n)
        a[x][++y] = ++cnt;
    if (a[x + 1][y] == 0 && x + 1 <= n)
        a[++x][y] = ++cnt;
}

S

所谓反 S,就是按照反 S 的方向去填数。

效果
  1  2  3  4
  8  7  6  5
  9 10 11 12
 16 15 14 13
代码
int x = 1, y = 0, cnt = 0;
while (cnt < n * n) {
    while (a[x][y + 1] == 0 && y + 1 <= n)
        a[x][++y] = ++cnt;
    if (a[x + 1][y] == 0 && x + 1 <= n)
        a[++x][y] = ++cnt;
    while (a[x][y - 1] == 0 && y - 1 >= 1)
        a[x][--y] = ++cnt;
    if (a[x - 1][y] == 0 && x - 1 >= 1)
        a[--x][y] = ++cnt;
}

偶数列向下填充

所谓偶数列向下填充,就是在偶数列时,需要向下填充。

效果
  4  5 12 13
  3  6 11 14
  2  7 10 15
  1  8  9 16
代码
int x = n, y = 0, cnt = 0;
while (cnt < n * n) {
    if (a[x][y + 1] == 0 && y + 1 <= n)
        a[x][++y] = ++cnt;
    while (a[x + 1][y] == 0 && x + 1 <= n)
        a[++x][y] = ++cnt;
    if (a[x][y - 1] == 0 && y - 1 >= 1)
        a[x][--y] = ++cnt;
    while (a[x - 1][y] == 0 && x - 1 >= 1)
        a[--x][y] = ++cnt;
}

奇数列向下填充

所谓奇数列向下填充,就是在奇数列时,需要向下填充。

效果
  1  8  9 16
  2  7 10 15
  3  6 11 14
  4  5 12 13
代码
int x = 1, y = 0, cnt = 0;
while (cnt < n * n) {
    if (a[x][y + 1] == 0 && y + 1 <= n)
        a[x][++y] = ++cnt;
    while (a[x + 1][y] == 0 && x + 1 <= n)
        a[++x][y] = ++cnt;
    if (a[x][y - 1] == 0 && y - 1 >= 1)
        a[x][--y] = ++cnt;
    while (a[x - 1][y] == 0 && x - 1 >= 1)
        a[--x][y] = ++cnt;
}