矩阵旋转 java_在Java中旋转NxN矩阵

概观

考虑一个样本矩阵可能如下所示:

ABCD

EFGH

IJKL

MNOP

为了我的解释,ABCD被认为是行0,EFGH是第1行,依此类推。行0的第一个像素是A.

另外,当我谈到外壳时,我指的是:

ABCD

E H

I L

MNOP

首先我们来看看移动值的代码。

int top = matrix[first][i]; // save top

第一行将值缓存在顶部位置。这是指由[first] [i]确定的矩阵的顶行上的位置。例如:保存A.

// left -> top

matrix[first][i] = matrix[last-offset][first];

下一部分将值从左侧位置移动到顶部位置。例如:把M放在A的位置。

// bottom -> left

matrix[last-offset][first] = matrix[last][last - offset];

下一部分将值从底部位置移动到左侧位置。例如:拿P并把它放在M的地方。

// right -> bottom

matrix[last][last - offset] = matrix[i][last];

下一个部分将值从正确位置移动到底部位置。例如:拿D并把它放在P所在的位置。

// top -> right

matrix[i][last] = top; // right

最后一部分将缓存中的值(顶部位置)移动到正确的位置。例如:把A从D的第一步。

接下来的循环。

外部循环从行0到总行数的一半。这是因为当您旋转第0行时,它也会旋转最后一行,当您旋转第1行时,它也会旋转第二行到最后一行,依此类推。

内循环从行中的第一个像素位置(或列)运行到最后一个。请记住,对于行0,这是从像素0到最后一个像素,但对于行1,这是从像素1到第二个到最后一个像素,因为第一个和最后一个像素作为行0的一部分旋转。

所以外圈的第一次迭代使得外壳旋转。换一种说法:

ABCD

EFGH

IJKL

MNOP

变为:

MIEA

NFGB

OJKC

PLHD

看看外壳是如何顺时针旋转的,但内芯没有移动。

然后外循环的第二次迭代导致第二行旋转(不包括第一个和最后一个像素),我们最终得到:

MIEA

NJFB

OKGC

PLHD

概观 考虑一个样本矩阵可能如下所示: ABCD EFGH IJKL MNOP 为了我的解释,ABCD被认为是行0,EFGH是第1行,依此类推。行0的第一个像素是A. 另外,当我谈到外壳时,我指的是: ABCD E H I L MNOP 首先我们来看看移动值的代码。 int top = matrix[first][i]; // save top 第一行将值缓存在顶部位置。这是指由[first] [i]确定的矩阵的顶行上的位置。例如:保存A. // left -> top matrix[first][i] = matrix[last-offset][first]; 下一部分将值从左侧位置移动到顶部位置。例如:把M放在A的位置。 // bottom -> left matrix[last-offset][first] = matrix[last][last - offset]; 下一部分将值从底部位置移动到左侧位置。例如:拿P并把它放在M的地方。 // right -> bottom matrix[last][last - offset] = matrix[i][last]; 下一个部分将值从正确位置移动到底部位置。例如:拿D并把它放在P所在的位置。 // top -> right matrix[i][last] = top; // right 最后一部分将缓存中的值(顶部位置)移动到正确的位置。例如:把A从D的第一步。 接下来的循环。 外部循环从行0到总行数的一半。这是因为当您旋转第0行时,它也会旋转最后一行,当您旋转第1行时,它也会旋转第二行到最后一行,依此类推。 内循环从行中的第一个像素位置(或列)运行到最后一个。请记住,对于行0,这是从像素0到最后一个像素,但对于行1,这是从像素1到第二个到最后一个像素,因为第一个和最后一个像素作为行0的一部分旋转。 所以外圈的第一次迭代使得外壳旋转。换一种说法: ABCD EFGH IJKL MNOP 变为: MIEA NFGB OJKC PLHD 看看外壳是如何顺时针旋转的,但内芯没有移动。 然后外循环的第二次迭代导致第二行旋转(不包括第一个和最后一个像素),我们最终得到: MIEA NJFB OKGC PLHD
经验分享 程序员 微信小程序 职场和发展