螺旋矩阵
给定一个正整数 n,生成一个包含 1 到 n*n 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:模拟顺时针画矩阵的过程,1.从左到右;2.从上到下;3.从右往左;4.从下往上,每次都在前闭后开区间[a,b),从(0,0)开始每一圈都以矩阵的左上角为起点画圆,一圈结束后,起点的x,y加1继续画圆,如果n为偶数,则需要画n/2个圆;如果n为奇数,则画n/2个原后,将矩阵中心的值(n/2,n/2)赋值为n*n;
vector<vector<int>> generateMaxtix(int n){
vector<vector<int>> result(n,vector<int>(n,0));
int startX = 0; //起始点的X坐标
int startY = 0; //起始点的Y坐标
int loop = n/2; //循环的圈数
int item = 1; //矩阵赋值的初始值
while(loop--){
int endX = n - startX - 1; //每次画圈的截至行号
int endY = n - startY - 1; //每次画圈的截至列号
//从左到右
for(int j = startY; j < endY; ++j)
result[startX][j] = item++;
//从上到下
for(int i = startX; i < endX; ++i)
result[i][endY] = item++;
//从右到左
for(int j = endY; j > startY; --j)
result[endX][j] = item++;
//从下到上
for(int i = endX; i > startX; --i)
result[i][startY] = item++;
++startX;
++startY;
}
if(n&1) //n为奇数的时候矩阵中心点赋值
result[n/2][n/2] = item;
return result;
}