螺旋矩阵
原题链接
题目说明:
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
代码:
class Solution {
public int[][] generateMatrix(int n) {
int res[][] = new int[n][n];//用于存数据
boolean v[][] = new boolean[n][n];//用于标记是否填充数据
//(x,y)的移动方向为: 右下左上
/*x,y的偏移量如下:
(x+1,y)
(x,y-1) (x,y) (x,y+1)
(x-1,y)
*/
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int x = 0,y = 0,d = 0;
for(int i = 1; i <= n*n; i++){
int nx = x + dx[d];
int ny = y + dy[d];
//判断是否越界或者是否走过。
if(nx < 0||nx >= n||ny < 0||ny >= n||v[nx][ny]){
//是的话取模,进行下一圈
d = (d + 1) % 4;
nx = x + dx[d];
ny = y + dy[d];
}
res[x][y] = i;
v[x][y] = true;
x = nx;
y = ny;
}
return res;
}
}
这是之前自己研究的模板:
虽然好理解点,但是太繁琐
import java.util.Scanner;
public class Test7 {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
int n = in.nextInt();
int m = in.nextInt();
int[][] num = new int[n][m];
int r = in.nextInt();
int c = in.nextInt();
f(num, n, m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.print(num[i][j] + " ");
}
System.out.println();
}
System.out.println(num[r - 1][c - 1]);
}
public static void f(int[][] num, int n, int m) {
int temp = 1;
int left = 0;
int right = m - 1;
int up = 0;
int down = n - 1;
while (true) {
for (int i = left; i <= right; i++) {
num[up][i] = temp++;
}
up++;
if (countiue(up, down, left, right)) {
return;
}
for (int i = up; i <= down; i++) {
num[i][right] = temp++;
}
right--;
if (countiue(up, down, left, right)) {
return;
}
for (int i = right; i >= left; i--) {
num[down][i] = temp++;
}
down--;
if (countiue(up, down, left, right)) {
return;
}
for (int i = down; i >= up; i--) {
num[i][left] = temp++;
}
left++;
if (countiue(up, down, left, right)) {
return;
}
}
}
public static boolean countiue(int up, int down, int left, int right) {
if (up > down || left > right) {
return true;
}
return false;
}
}