问题描述:
Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
Example:
Input: 3 Output: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
解题思路:
这道题我认为主要是找到什么时候变化坐标以及如何变化。
要求螺旋状填充矩阵:即
可以看到几个关键的变换方向的转折点,那我们来寻找它变换方向的条件:
以ret[i][j]来表达矩阵中的一个元素
当 i > n-1 或 i < 0时需要变换方向,同理对j
当ret[i][j]有值时需要变换方向
可以发现:方向变化都是有规律的
即 右-> 下 -> 左 -> 上 -> 右
不妨以这个顺序来试探,并且改变方向
需要注意的是:
找不到合适方向后需要对当前值进行检测!因为当前值可能就是最后的值!否则会陷入死循环!
代码:
#define R 0 #define D 1 #define L 2 #define U 3 class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> ret(n, vector<int>(n, 0)); int count = 1; int i = 0, j = 0; int limit = n*n; int direction = R; while(count <= limit){ ret[i][j] = count; if(direction == R){ j++; if(j < n && ret[i][j] == 0){ count++; continue; } direction = D; j--; } if(direction == D){ i++; if(i < n && ret[i][j] == 0){ count++; continue; } direction = L; i--; } if(direction == L){ j--; if(j > -1 && ret[i][j] == 0){ count++; continue; } direction = U; j++; } if(direction == U){ i--; if(i > -1 && ret[i][j] == 0){ count++; continue; } direction = R; i++; } if(count == limit) break; } return ret; } };