蛇形方阵(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;
}