【题目描述】
给你一个正整数 n
,生成一个包含 1
到 n^2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
【示例1】
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
【示例2】
输入:n = 1
输出:[[1]]
【提示】
- 1 <= n <= 20
解题思路
- 这道题没有用到什么算法,就纯粹的循环,过程有点绕,最好多调试一下,防止出错。
- 自创贪吃蛇法:贪吃蛇需要按照四种方向循环前进,顺序是:右->下->左->上。当贪吃蛇碰壁了(这里判定条件为“穿模”)或者吃到了自己,则贪吃蛇回退一格,并按照下一次方向前进一格,等待下个回合重新开始吃果子。吃到最后的临界条件是:果子不够了。
自创贪吃蛇法
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
/*定义“贪吃蛇”的方向,防止绕晕*/
#define LEFT 0
#define RIGHT 1
#define UP 2
#define DOWN 3
/*初始化二维向量,全部赋值为0*/
vector<vector<int>> Matrix(n,vector<int>(n,0));
int dir = RIGHT; // 开始的时候“贪吃蛇”往右边走
int i=0;int j=0; // 当前的方位
int num = 0;
/*超出计数上界,自动退出循环*/
while(num<n*n){
/*以向右“吃果子”为例*/
while(dir == RIGHT){
/*“碰壁了”或者“吃到了自己的身体”*/
if(j>=n || Matrix[i][j]!=0){
/*“回退”并且“转向至指定方向”,这里需要在指定方向前进一格*/
j--;i++;dir = DOWN;
break;
}else{
/*“吃果子中”*/
Matrix[i][j] = ++num;
}
/*向目标方向移动“蛇身”*/
j++;
}
/*右->下*/
while(dir == DOWN){
if(i>=n || Matrix[i][j]!=0){
i--;j--;dir = LEFT;
break;
}else{
Matrix[i][j] = ++num;
}
i++;
}
/*下->左*/
while(dir == LEFT){
if(j<0 || Matrix[i][j]!=0){
i--;j++;dir = UP;
break;
}else{
Matrix[i][j] = ++num;
}
j--;
}
/*左->上*/
while(dir == UP){
if(i<0 || Matrix[i][j]!=0){
i++;j++;dir = RIGHT;
break;
}else{
Matrix[i][j] = ++num;
}
i--;
}
}
return Matrix;
}
};