题目
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
解答
解法一:轮圈赋值
解法与 螺旋矩阵 没有太大区别,只是反过来了而已。
螺旋矩阵解法:https://blog.csdn.net/LetJava/article/details/95523553
代码
class Solution {
public int[][] generateMatrix(int n) {
if(n == 0) return new int[0][0];
int count = 1;
int[][] matrix = new int[n][n];
int u = 0, d = n - 1, l = 0, r = n - 1;
for(;;) {
for(int i = l; i <= r; i ++) matrix[u][i] = count ++;
if(++ u > d) break;
for(int i = u; i <= d; i ++) matrix[i][r] = count ++;
if(-- r < l) break;
for(int i = r; i >= l; i --) matrix[d][i] = count ++;
if(-- d < u) break;
for(int i = d; i >= u; i --) matrix[i][l] = count ++;
if(++ l > r) break;
}
return matrix;
}
}
结果
解法二:回溯法
按照回溯的顺序赋值即可。
代码
class Solution {
// (上) 右 下 左 上
int[][] d = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public int[][] generateMatrix(int n) {
if(n == 0) return new int[0][0];
int[][] matrix = new int[n][n];
fill(matrix, 0, 0, 1);
return matrix;
}
private void fill(int[][] matrix, int x, int y, int num) {
matrix[x][y] = num;
int startIdx = 1;
// 向左 和 向下 都不能使用的话,说明是最左边的那一列,优先搜索 上 即可
if(!canUse(matrix, x, y - 1) && !canUse(matrix, x + 1, y)) startIdx = 0;
for(int i = startIdx; i < d.length; i ++) {
int newX = x + d[i][0];
int newY = y + d[i][1];
if(canUse(matrix, newX, newY)) {
fill(matrix, newX, newY, num + 1);
}
}
}
private boolean canUse(int[][] matrix, int x, int y) {
return x >= 0 && x < matrix.length && y >= 0 && y < matrix.length && matrix[x][y] == 0;
}
}