这是一个来自 Java 程序的 sn-p,用于执行螺旋矩阵访问。它跟踪方向的变化,以感知在任何给定方向旅行时还要进行多少次访问。简化此问题的模式是,在任何给定方向旅行时,下次您访问该方向时,访问次数会减少一次。更简单地说,如果您第一次沿水平方向旅行,您将进行 6 次访问,下次您沿水平方向旅行时,您将进行 5 次访问。还应该注意的是,横向和纵向访问是分开跟踪的。在需要改变方向后,使用下面的单个方程来计算给定方向的访问次数。这个方程通过从方向变化的总数中推导出来选择垂直或水平,并使用 mod 作为选择器。最后,将访问想象成一条沿着矩阵移动的蛇,我将步骤表示为行/列中的变化为速度(dy 和 dx)。正如另一个人指出的那样,有一种可以使用的模式,并在 dy 和 dx 的公式中表示。
int[][] matrix = { { 1, 2, 3, 4, 5, 6, 7, 8 },
{ 24, 25, 26, 27, 28, 29, 30, 9 },
{ 23, 40, 41, 42, 43, 44, 31, 10 },
{ 22, 39, 48, 47, 46, 45, 32, 11 },
{ 21, 38, 37, 36, 35, 34, 33, 12 },
{ 20, 19, 18, 17, 16, 15, 14, 13 } };
int n = matrix.length;
int m = matrix[0].length;
int row = 0;
int col = 0;
int dx = 1;
int dy = 0;
int dirChanges = 0;
int visits = m;
for (int i = 0; i < n * m; i++) {
System.out.print(matrix[row][col] + " ");
visits--;
if (visits == 0) {
visits = m * (dirChanges %2) + n * ((dirChanges + 1) %2) - (dirChanges/2 - 1);
int temp = dx;
dx = -dy;
dy = temp;
dirChanges++;
}
col += dx;
row += dy;
}
这个程序的输出是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 44 48