我有一个 2D 矩阵 M[N][N] 我需要逆时针旋转 90 度。我已经看到很多顺时针旋转的答案,但我找不到逆时针方向。这两个操作有多相似?
问问题
2244 次
5 回答
3
如果你颠倒每一行的顺序,然后以与顺时针旋转相反的顺序取行,你会得到一个逆时针旋转。
A B C G D A A D G C F I
D E F -> Clockwise -> H E B -> Reverse -> B E H -> Opposite -> B E H
G H I I F C Rows C F I Ordering A D G
Matrix Counter
Clockwise
如果您已经有可用的顺时针旋转算法,通常以相反的顺序对原始矩阵进行顺时针旋转会更容易(并且计算效率更高)。
1 2 3 9 8 7 3 6 9
4 5 6 -> Reverse -> 6 5 4 -> Clockwise -> 2 5 8
7 8 9 Indices 3 2 1 1 4 7
Matrix Counter
Clockwise
您也可以顺时针旋转 3 圈以逆时针旋转。
尽管实际上,根据您的目的直接编辑顺时针算法通常相当容易。因此,如果您不关心效率并且不想通过改变旋转方向的逻辑来工作,我只会使用上述选项。
于 2013-04-05T16:59:48.307 回答
0
从 row(max),递减,用该列的值一个接一个地填充结果行(递增索引)(递增)。
所以在 3 x 3 中,使用(使用 r,c 符号,如 Excel)
(3, 1), (3, 2), (3, 3), (2, 1), (2, 2), (2, 3),
等等
于 2013-04-05T16:45:54.707 回答
0
好的。让我们说N =2
简单:
1 2
3 4
逆时针90度意味着它将变成:
2 4
1 3
我们有以下规则:
1 last column from top to bottom of original matrix becomes
first row of rotated matrix from left to right
2 first column of original matrix becomes last row of rotated matrix
3 same rules apply to other columns of original matrix
您可以轻松地编写代码。另一种方法是首先对矩阵进行转置,然后反转所有行的顺序。
于 2013-04-05T16:49:58.960 回答
0
如果您使用的是特定的矩阵库,您可以只进行 3 次转置
于 2013-04-05T17:00:38.933 回答
0
public static void main(String[] args) {
int[][] matrix = createAMatrix(3,3);
List<Stack<Integer>> tiltedMatrix = tiltMatrixBy90Now(matrix, 3);
int[][] newMatrix = new int[3][3];
for(int i = 0; i < 3; i ++) {
for(int j = 0; j < 3; j ++) {
newMatrix[i][j] = tiltedMatrix.get(j).pop();
}
}
//print new matrix
for(int i = 0; i < 3; i ++) {
for(int j = 0; j < 3; j ++) {
System.out.print(newMatrix[i][j]+" ");
}
System.out.println();
}
}
private static List<Stack<Integer>> tiltMatrixBy90Now(int[][] matrix , long order) {
List<Stack<Integer>> stackList = new ArrayList<>();
//filling the stack
for(int i = 0; i< order ; i++) {
stackList.add(new Stack<Integer>());
}
for(int i = 0; i < order; i ++) {
for(int j = 0; j < order; j ++) {
stackList.get(i).push(matrix[i][j]);
}
}
return stackList;
}
private static int[][] createAMatrix(final int a, final int b){
int counter = 1;
int[][] matrix = new int[a][b];
Scanner scanner = new Scanner(System.in);
while(counter <= a*b) {
for(int i = 0; i < a; i ++) {
for(int j = 0; j < b; j ++) {
matrix[i][j] = scanner.nextInt();
counter++;
}
}
}
return matrix;
}
/*
输入矩阵(3乘3)1 2 3 4 5 6 7 8 9
输出矩阵(3乘3):3 6 9 2 5 8 1 4 7
代码演练作为文本解释
- 创建一个矩阵,在上面的代码中是3*3的矩阵
- 从 3*3 矩阵的每一行创建 3 个堆栈
- 并行地从每个堆栈中逐一弹出并重新创建矩阵。
- 将新的倾斜矩阵打印 90 度(逆时针)。
*/
于 2019-08-18T13:44:41.837 回答