所谓蛇形数其实一种泛指的说法,只要把数字按顺序读下去能够像一条蛇一样盘旋曲折,就可以理解成蛇形数.
目前我接触到的有两种:
1. 休息中的蛇(盘在一起)
首先分析一下解题思路,
首先第一个位置一定是1,从第一个位置开始,往下或者往右其实都可以,以往下为例,则横坐标一直加到不能再加为止,然后往右走,走到不能再右,然后往上,再往左.
接下来就是一个循环了.
那么如何判断无法继续走呢.以本图为例,这是一个5 * 5的矩阵,自然就有25个数字,所以很容易判断出,行列均为5.
下面给出实现代码(方向上有点差异)
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int snake[20][20] = {0}; int main(int argc, char **argv) { int n = 4; int i = 1; int r = 0; int c = n - 1; snake[r][c] = i; while (i < n * n) { while (r + 1 < n && snake[r + 1][c] == 0) { snake[++r][c] = ++i; } while (c - 1 >= 0 && snake[r][c - 1] == 0) { snake[r][--c] = ++i; } while (r - 1 >= 0 && snake[r - 1][c] == 0) { snake[--r][c] = ++i; } while (c + 1 < n && snake[r][c + 1] == 0) { snake[r][++c] = ++i; } } int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d\t", snake[i][j]); } printf("\n"); } return 0; }
分析一下这条蛇:
我们可以发现,可以把这个蛇分层考虑.第一层是1, 第二层是2,3,然后是第三层...如果再拆分一下坐标或许看得更清楚一些:
0,0 ---> 1
1,0 ---> 2
0,1 ---> 3
0,2 ---> 4
1,1 ---> 5
2,0 ---> 6
那么可以分析得出,没一层加起来的和不超过层数.
下面给出实现代码:
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int snake[20][20]; int main(int argc, char **argv) { int i = 0; int j = 0; int k = 1; int dir = 0; int max = 8; // 这个值尽量给n*(n+1) / 2 int n = 0; snake[i][j] = k; j++; n++; while (k <= 8 * 8) { if (dir == 1) { while (j <= n) { snake[i][j] = ++k; j++; if (i == 0) { break; } i--; } n++; dir = !dir; } else { while (i <= n) { snake[i][j] = ++k; i++; if (j == 0) { break; } j--; } n++; dir = !dir; } } for (i = 0; i < 20; i++) { for (j = 0; j < 20; j++) { printf("%d\t", snake[i][j]); } printf("\n"); } return 0; }
细想一下,这玩意就跟小学初中的时候,没事老师就拿出几道奥数题来锻炼我们.可能难度并不大,但是对于思路的确可以起到一定的拓展作用.