螺旋矩阵
顺时针
今天碰到的两个问题都涉及到了螺旋矩阵的生成,想着用单个外层循环,和两个全局的矩阵坐标、一个控制螺旋结构向内缩紧的变量来实现。
因为每次转向只有一个坐标发生的位移,基于这一点大致理了理关系虽然应该还算是没理清楚 ,初步实现了构建顺时针螺旋矩阵
待有所长进,再来研究。
源码:
public class Main {
public static void main(String[] args) {
int[][] mat = Echo(4, 4);
for (int[] line:mat) {
for (int i:line)
System.out.print(i + " ");
System.out.println();
}
}
static int[][] Echo(int n, int m) {
int[][] mat = new int[n][m];
int deep = n * m, var = 0, drift = 0, i, j;
for (i = j = drift; var < deep; i = j = ++drift) {
while (j < m - drift)
mat[i][j++] = ++var;
if (++i < n - drift) {
for (j--; i < n - drift;)
mat[i++][j] = ++var;
for (i--, j--; j > drift;)
mat[i][j--] = ++var;
}
if (i != n - drift && j == drift)
while (i > drift)
mat[i--][j] = ++var;
}
return mat;
}
}
第一版
这个版本只能满足行高列宽皆为偶数时的顺时针螺旋矩阵生成,不过我觉得思路还算的上通透,就放下面保存下来了。
public class Main {
public static void main(String[] args) {
//Scanner sc = new Scanner(System.in);
int n = 6, m = 8;
int[][] mat = new int[n][m];
for (int i = 0, j = 0, micro = 0, high = 0, BiteMyTongue = n * m; high < BiteMyTongue; micro++, i++) {
for (j = micro; j < m - micro - 1; j++)
mat[i][j] = ++high;
for (i = micro; i < n - micro - 1; i++)
mat[i][j] = ++high;
for (j = m - micro - 1; j > micro; j--)
mat[i][j] = ++high;
for (i = n - micro - 1; i > micro; i--)
mat[i][j] = ++high;
}
for (int[] line:mat) {
for (int i:line) System.out.print(i + " ");
System.out.println();
}
}
}