当前位置:网站首页>C语言力扣第59题螺旋矩阵②。模拟矩阵

C语言力扣第59题螺旋矩阵②。模拟矩阵

2022-08-06 07:25:55管二狗绝不摆烂

59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

该题目思路与I类似,感兴趣可参考本人另一篇博客。

C语言力扣第54题之螺旋矩阵。模拟旋转_管二狗绝不摆烂的博客-CSDN博客

模拟矩阵的生成。按照要求,初始位置设为矩阵的左上角,初始方向设为向右。若下一步的位置超出矩阵边界,或者是之前访问过的位置,则顺时针旋转,进入下一个方向。如此反复直至填入 n^2 个元素。

记 matrix为生成的矩阵,其初始元素设为 0。由于填入的元素均为正数,我们可以判断当前位置的元素值,若不为 0,则说明已经访问过此位置。

生成一个 n×n 空矩阵 mat,随后模拟整个向内环绕的填入过程:

-定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n;
    -当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
       - 执行 num += 1:得到下一个需要填入的数字;
       - 更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
    -使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。

-最终返回 mat 即可。

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
    int maxNum = n * n;
    int curNum = 1;
    int** matrix = malloc(sizeof(int*) * n);
    *returnSize = n;
    *returnColumnSizes = malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) {
        matrix[i] = malloc(sizeof(int) * n);
        memset(matrix[i], 0, sizeof(int) * n);
        (*returnColumnSizes)[i] = n;
    }
    int row = 0, column = 0;
    int directions[4][2] = {
   {0, 1}, {1, 0}, {0, -1}, {-1, 0}};  // 右下左上
    int directionIndex = 0;
    while (curNum <= maxNum) {
        matrix[row][column] = curNum;
        curNum++;
        int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
        if (nextRow < 0 || nextRow >= n || nextColumn < 0 || nextColumn >= n || matrix[nextRow][nextColumn] != 0) {
            directionIndex = (directionIndex + 1) % 4;  // 顺时针旋转至下一个方向
        }
        row = row + directions[directionIndex][0];
        column = column + directions[directionIndex][1];
    }
    return matrix;
}

原网站

版权声明
本文为[管二狗绝不摆烂]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_52505851/article/details/126186355

随机推荐