Arrays 将二维阵列旋转90度

Arrays 将二维阵列旋转90度,arrays,algorithm,rotation,Arrays,Algorithm,Rotation,在数组操作练习中经常遇到的一个问题是将二维数组旋转90度。有一些SO帖子回答了如何在各种编程语言中实现这一点。我的问题是澄清其中一个答案,并探索需要什么样的思维过程才能以有机的方式获得答案 我发现这个问题的解决方案如下: public static void rotate(int[][] matrix,int n) { for( layer = 0;layer < n/2;++layer){ int first = layer; int last = n -1

在数组操作练习中经常遇到的一个问题是将二维数组旋转90度。有一些SO帖子回答了如何在各种编程语言中实现这一点。我的问题是澄清其中一个答案,并探索需要什么样的思维过程才能以有机的方式获得答案

我发现这个问题的解决方案如下:

public static void rotate(int[][] matrix,int n)
{
  for( layer = 0;layer < n/2;++layer){
      int first = layer;
      int last = n -1 - layer;
      for(int i = first;i<last;++i){
        int offset = i - first;
        int top = matrix[first][i];
        matrix[first][i] = matrix[last-offset][first];
        matrix[last-offset][first] = matrix[last][last-offset];
        matrix[last][last-offset] = matrix[i][last];
        matrix[i][last] = top;
       }
    }
}
publicstaticvoidrotate(int[][]矩阵,int n)
{
用于(层=0;层对于(inti=first;i来说,思想是将大任务(旋转方阵)分解为更小的任务

首先,一个正方形矩阵可以分解成同心的正方形环。一个环的旋转与其他环的旋转无关,因此旋转矩阵只需逐个旋转每个环。在这种情况下,我们从最外层的环开始向内工作。我们使用
(或
第一个
,同样的事情)来计算环数,当我们到达中间时停止,这就是为什么它会上升到
n/2
(值得检查,以确保这对奇数和偶数
n
)跟踪“远边”很有用例如,在5x5矩阵中,第一个环从
first=0
开始,在
last=4
结束,第二个环从
first=1
开始,在
last=3
结束,依此类推


如何旋转一个环?沿上边缘向右走,沿左边缘向上走,沿下边缘向左走,沿右边缘向下走,所有这些都是同时进行的。每一步交换四个值。改变的坐标是
i
,步数是
offset
。例如,当绕第二个环走时,
i
goes{1,2,3}和
offset
goes{0,1,2}。

只需在调试器中运行它或打印中间结果……(或
第一个
,同样的事情)注释可能会混淆--
第一层
碰巧总是相同的数字,但在概念上它们是不同的。
用于计算我们所处的同心环,而
第一层
最后一层
跟踪每条边的起点和终点。感谢您提供了详细的答案。因此经验丰富的算法学家得到最后一个=n-1层,偏移量为i-first,他们只是在观察环上行走的模式?我的问题可能有点奇怪,但我试图得到的是如何根据二维数组的特征得到n-1层和i-first表达式。我在这里试图捕捉的是“这是解决这些问题背后的思维过程,你在回答中已经很好地阐述了其中的一些问题。@sc_ray:方法是将问题分解为更简单的问题;结果是交换四个点并在正方形上迭代。一种迭代正方形的方法是通过环,另一种方法是迭代一个环。”是通过使用
n-1-layer
i-first
。如果这不清楚,我建议先尝试一个更简单的问题,比如一次迭代一个矩形或三角形的点(而不是四个)。