在Golang中以顺时针方向将对称矩阵或图像旋转的方法

242 阅读1分钟

概述

给出一个以矩阵形式表示的图像,将这个矩阵或图像按顺时针方向旋转。

例如

输入。

[[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]]