概述
给出一个以矩阵形式表示的图像,将这个矩阵或图像按顺时针方向旋转。
例如
输入。
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
输出。
7, 4, 1
8, 5, 2
9, 6, 3
我们的想法是逐一遍历所有的边框,并在原地交换每个边。上述矩阵的外部边界是
7 4 1
8 2
9 6 3
我们可以用这种方式来旋转矩阵
7->1->3->9
4->2->6->8
一个大小为n*n的对称矩阵将有n-1条边。例如,上面的矩阵有两个边框
第一条边框
7 4 1
8 2
9 6 3
第二条边框
5
程序
以下是相同的程序
package main
import "fmt"
func main() {
matrix := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
rotate(matrix)
matrix = [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
rotate(matrix)
}
func rotate(matrix [][]int) {
matrixSize := len(matrix)
startRow := 0
endRow := matrixSize - 1
startColumn := 0
endColumn := matrixSize - 1
for i := 0; i < matrixSize; i++ {
totalCycles := endRow - startRow
for j := 0; j < totalCycles; j++ {
temp := matrix[startRow][startColumn+j]
matrix[startRow][startColumn+j] = matrix[endRow-j][startColumn]
matrix[endRow-j][startColumn] = matrix[endRow][endColumn-j]
matrix[endRow][endColumn-j] = matrix[startRow+j][endColumn]
matrix[startRow+j][endColumn] = temp
}
startRow = startRow + 1
endRow = endRow - 1
startColumn = startColumn + 1
endColumn = endColumn - 1
}
fmt.Println(matrix)
}
输出
[[7 4 1] [8 5 2] [9 6 3]]
[[13 9 5 1] [14 10 6 2] [15 11 7 3] [16 12 8 4]]