螺旋矩阵(已优化)
这是一道模拟题,我们首先定义一个二维数组,然后将他的边界定义出来,定义好边界后就开始往数组中放数字,每次到达边界,就改变方向,但注意奇数的螺旋矩阵最中间的数需要自己定义,否则会造成死循环
以下代码实现(优化前)
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { //二维数组初始化 int k; scanf("%d", &k); int** a = (int**)malloc(sizeof(int*) * k); for (int h = 0; h < k; h++) a[h] = (int*)malloc(sizeof(int) * k); //边界初始化 int m = 0, n = k-1, x = 0, y = k-1; //定义行和列 int i = 0, j = 0; //计数 int u = 1; //当奇数矩阵时,将最中间的位置,特殊规定 if (k % 2 == 1) a[k / 2][k / 2] = k * k; //开始填数 while (1) { //每次到达边界改变方向 for (; j < n; j++) { a[i][j] = u++; if (u > k*k)break; } if (u > k * k)break; for (; i < y; i++) { a[i][j] = u++; if (u > k * k)break; } if (u > k * k)break; for (; j > m; j--) { a[i][j] = u++; if (u > k * k)break; } if (u > k * k)break; for (; i > x; i--) { a[i][j] = u++; if (u > k * k)break; } if (u > k * k)break; //奇数的最后一个数是k*k-1,所以特殊规定 if (k % 2 == 1 && u == k * k ) break; //填完一圈之后缩小矩阵范围 m++; n--; x++; y--; //将行和列放在正确的方向上 i++; j++; } //输出 for (int g = 0; g < k; g++) { for (int h = 0; h < k; h++) { printf("%3d", a[g][h]); } printf("\n"); } return 0; }
c++:
class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n, vector<int>(n, 0)); int m = 0, v = n-1, x = 0, y = n-1; int i = 0, j = 0; int u = 1; if (n % 2 == 1) res[n / 2][n / 2] = n * n; while (1) { for (; j < v; j++) { res[i][j] = u++; if (u > n*n)break; } if (u > n * n)break; for (; i < y; i++) { res[i][j] = u++; if (u > n * n)break; } if (u > n * n)break; for (; j > m; j--) { res[i][j] = u++; if (u > n * n)break; } if (u > n * n)break; for (; i > x; i--) { res[i][j] = u++; if (u > n * n)break; } if (u > n * n)break; if (n % 2 == 1 && u == n * n ) break; m++; v--; x++; y--; i++; j++; } for (int g = 0; g < n; g++) { for (int h = 0; h < n; h++) { printf("%3d", res[g][h]); } printf("\n"); } return res; } };
优化后:
每次都判断出下一个为零,然后立马将数字填上
#include<stdio.h> #include<string.h> int main(void) { int a[20][20]; memset(a, 0, sizeof(a)); int n; scanf("%d", &n); int tot = 0; int x = 0; int y = n - 1; a[x][y] = 1; tot++; while (tot < n * n) { while (x + 1 < n && !a[x + 1][y]) a[++x][y] = ++tot; while (y - 1 >= 0 && !a[x][y - 1]) a[x][--y] = ++tot; while (x - 1 >= 0 && !a[x - 1][y]) a[--x][y] = ++tot; while (y + 1 < n && !a[x][y + 1]) a[x][++y] = ++tot; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%3d ", a[i][j]); } printf("\n"); } }
计算机小白记录学习过程,喜欢就点个推荐和关注吧O(∩_∩)O哈哈~

浙公网安备 33010602011771号