给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ] ]
public int[][] generateMatrix(int n) {
if (n == 1) {
int[][] A = new int[1][1];
A[0][0] = 1;
return A;
}
int[][] A = new int[n][n];
//0代表往右,1代表往下,2代表往左,3代表往上
int direct = 0;
//从A[0][0]开始
int i = 0, j = 0;
int count = 2;
A[0][0] = 1;
while (true) {
//往右
if (direct == 0) {
//不能再往右边走了
if (j == n - 1 || A[i][j + 1] != 0) {
//下面也访问过,说明访问完了,可以直接返回
if (A[i + 1][j] != 0) {
return A;
} else {
//往下
direct = 1;
A[i + 1][j] = count++;
i++;
}
} else {
//继续往右
A[i][j + 1] = count++;
j++;
}
} else if (direct == 1) {
//不能再往下边走了
if (i == n - 1 || A[i + 1][j] != 0) {
//左边也访问过,说明访问完了,可以直接返回
if (A[i][j - 1] != 0) {
return A;
} else {
direct = 2;
A[i][j - 1] = count++;
j--;
}
} else {
//继续往下
A[i + 1][j] = count++;
i++;
}
} else if (direct == 2) {
//不能再往左边走了
if (j == 0 || A[i][j - 1] != 0) {
//上面也访问过,说明访问完了,可以直接返回
if (A[i - 1][j] != 0) {
return A;
} else {
//往上
direct = 3;
A[i - 1][j] = count++;
i--;
}
} else {
//继续往左
A[i][j - 1] = count++;
j--;
}
} else if (direct == 3) {
//不能再往上边走了
if (i == 0 || A[i - 1][j] != 0) {
//右边也访问过,说明访问完了,可以直接返回
if (A[i][j + 1] != 0) {
return A;
} else {
direct = 0;
A[i][j + 1] = count++;
j++;
}
} else {
//继续往上
A[i - 1][j] = count++;
i--;
}
}
}
}