题解 | #蛇形矩阵#
蛇形矩阵
https://www.nowcoder.com/practice/f228a074c5274619b26be544962375e1
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define row 50 #define col 50 //蛇形矩阵的移动方式有六种 分别为四种边界情况(左边界,右边界,上边界,下边界) 还有两种对角线移动的情况 //我们需要将上述六种移动情况分开处理 //相比于回形矩阵,蛇形矩阵的边界条件是不会发生改变的 //因此我们采用一次循环只赋值一个元素的方式,通过if语句来判断移动方式 //同时注意边界移动决定了对角线移动的方向(比如移动到上边界时,右移一位后会向左下方移动) //而且两种对角线移动方式的边界条件无法被区分 //因此我们需要引入一个变量来对 对角线移动方向进行标记(1和-1分别表示一种移动方向) //另外四种边界情况可以决定对角线的移动方向 static void Prinboard(int arr[row][col], int n) { int i = 0; for (i = 0; i < n; i++) { int j = 0; for (j = 0; j < n; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int arr[row][col] = { 0 }; int n = 0; scanf("%d", &n); int i = n * n; /*循环限定变量*/ int count = 1; int x = 0; int y = 0; /*相比于回形矩阵蛇形矩阵需要两个数组访问下标来对数组进行赋值*/ int Direct = 1; /*方向标记变量1表示对角线右上移动,-1表示对角线左下移动*/ while (i) { if (0 == x && y != n - 1 && 1 == Direct) /*上边界移动限制条件(对角线向右上方移动可达到 上边界)*/ { /*判断部分的方向变量可以避免上下左右边界移动连 续进行多次的情况发生*/ arr[x][y++] = count++; Direct = -1; /*上边界移动完后对角线移动方向变为-1(向左下移 动)*/ i--; } else if (x != n - 1 && 0 == y && -1 == Direct) /*左边界移动限制条件(对角线左下移动可以达到左 边界)*/ { arr[x++][y] = count++; Direct = 1; /* 左边界移动完后对角线移动方向变为右上方*/ i--; } else if (x != n - 1 && y == n - 1 && 1 == Direct)/*右边界移动限制条件(对角线向右上方移动达到右 边界)*/ { arr[x++][y] = count++; Direct = -1; /*右边界移动完后对角线移动方向改为左下方*/ i--; } else if (x == n - 1 && y != n - 1 && -1 == Direct)/*下边界移动限制条件(对角线左下方移动达到下对角线)*/ { arr[x][y++] = count++; Direct = 1; /*下边界移动完后对角线移动方向改为右上方*/ i--; } else if (1 == Direct) /*对角线右上方移动*/ { arr[x--][y++] = count++; i--; } else if (-1 == Direct) /*对角线左下方移动*/ { arr[x++][y--] = count++; i--; } } Prinboard(arr, n); return 0; }