給定一個正整數 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--;
}
}
}
}