1. 旋转矩阵

      https://leetcode-cn.com/problems/spiral-matrix-ii/

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

    示例 1:

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

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

    提示:

    1 <= n <= 20

    画矩阵的步骤 :
    从左到右填充上行
    从上至下填充右列
    从右至左填充下行
    从下至上填充左列

    PS :在赋值时保证每一次的循环 均为左闭右开即可

    1. class Solution {
    2. public:
    3. vector<vector<int>> generateMatrix(int n) {
    4. vector<vector<int>> res(n, vector<int>(n, 0));
    5. int count = 1;
    6. //每次循环的初始位置
    7. int xstart = 0;
    8. int ystart = 0;
    9. //控制每一行的长度
    10. int offset = 1;
    11. //控制循环次数
    12. int round = n / 2;
    13. int i, j;
    14. while (round--) {
    15. j = ystart;
    16. i = xstart;
    17. //从左至右 输入 (左闭右开)
    18. for (j = ystart; j < ystart + n - offset; ++j) {
    19. res[xstart][j] = count++;
    20. }
    21. //最右边 从上至下 仍是左闭右开
    22. for (i = xstart; i < xstart + n - offset; ++i) {
    23. res[i][j] = count++;
    24. }
    25. for ( ; j > ystart; --j) {
    26. res[i][j] = count++;
    27. }
    28. for ( ; i > xstart; --i) {
    29. res[i][j] = count++;
    30. }
    31. //每次一轮之后 下次的一圈长度 减少2 (各多了一列 一行)
    32. offset += 2;
    33. //起始位置调整 主对角线方向
    34. xstart++;
    35. ystart++;
    36. }
    37. int t = n % 2;
    38. //若最中间仍有元素 也要赋值
    39. if (n % 2)
    40. res[n / 2][n / 2] = count;
    41. return res;
    42. }
    43. };