打印二维数组——汇总

package Matrix

import (
	"fmt"
	"testing"
)

/*
矩阵处理技巧   矩阵二维数组特殊轨迹变化问题
1. zigzag 打印矩阵
 _                  -
| 1  2  3  4  5  6  |
| 7  8  9  10 11 12 |
| 13 14 15 16 17 18 |
-                  -

A:(0,0)
B:(0,0)
以后每一步 A 先向右走,走到不能再走的时候往下走
B和A 同步走,走到不能再往下走的时候,再往右走


1,2,7, 13,8,3,4,9,14....

2. 转圈打印矩阵

3. 原地旋转正方形矩阵

核心技巧:找到coding上的宏观调度


 */

func printMatrixZigZag(matrix [][]int) {
	Ax, Ay := 0, 0
	Bx, By := 0, 0
	Endx := len(matrix) - 1
	Endy := len(matrix[0]) - 1
	fromUp := false     //是不是从右上往左下打印
	for Ax != Endx + 1 { //终止位置的行号 + 1
		// 告诉你斜线的两端,A,B, 方向告诉你,你去打印
	    printLevel(matrix, Ax, Ay, Bx, By,fromUp)
		if Ay == Endy {
			Ax++
		}
		if Ay != Endy {
			Ay++
		}


		if Bx == Endx {
			By++
		}

		if Bx != Endx {
			Bx++
		}
		fromUp = !fromUp
	}
	fmt.Println()
}

func printLevel(m [][]int, tR,tC, dR, dC int,f bool) {
	if f {
		for tR != dR + 1 {
			fmt.Print(m[tR][tC]," ")
			tR++
			tC--
		}
	}else {
		for dR != tR - 1 {
			fmt.Print(m[dR][dC]," ")
			dR--
			dC++
		}
	}
}

/*
      1    2    3    4
      5    6    7    8
      9    10   11   12
      13   14   15   16 
 */

func TestPrintMatrixZigZag(t *testing.T)  {
	matrix := [][]int{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}
	printMatrixZigZag(matrix)
}



/*
转圈打印矩阵
      1    2    3    4    5
      6    7    8    9    10
      11   12   13   14   15
      16   17   18   19   20



矩阵可以要求不是正方形

1,2,3,4,5,10,15,20,19,18,17,16,11,6,7,8,9,14,13,12
1 2 3 4 5 10 15 20 19 18 17 16 11 6 7 8 9 14 13 12
按层分解
*/

func printEdge(m [][]int, a,b,c,d int)  {
	if a == c {
		for i := b; i <= d; i++ {
			fmt.Print(m[a][i], " ")
		}
	}else if b == d {
		for i := a; i <= c; i++ {
			fmt.Print(m[i][b], " ")
		}
	}else {
		curC := b
		curR := a
		for curC != d {
			fmt.Print(m[a][curC], " ")
			curC++
		}
		for curR != c {
			fmt.Print(m[curR][d], " ")
			curR++
		}
		for curC != b {
			fmt.Print(m[c][curC], " ")
			curC--
		}
		for curR != a {
			fmt.Print(m[curR][b], " ")
			curR--
		}
	}
}

func spiralOrderPrint(matrix [][]int)  {
	tR,tC := 0, 0
	dR := len(matrix) - 1
	dC := len(matrix[0]) - 1
	for tR <= dR && tC <= dC {
		printEdge(matrix,tR,tC,dR,dC)
		tR++
		tC++
		dR--
		dC--
	}
	fmt.Println()
}

func TestSpiralOrderPrint(t *testing.T)  {
	matrix := [][]int{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}}
	spiralOrderPrint(matrix)
}




//原地旋转正方形矩阵
func printMatrix(matrix [][]int) {
	print := func(nums [][]int) {
		for _, v := range nums {
			for _, n := range v {
				fmt.Print("\t", n)
			}
			fmt.Println()
		}
		fmt.Println("---------------")
	}



	print(matrix)
	startX ,startY, endX ,endY := 0,0,len(matrix[0]) - 1, len(matrix[0]) - 1
	for startX < endX {
		for i := 0; i < endX-startX; i++ {
			matrix[startX][startY+i], matrix[endX-i][startY], matrix[endX][endY-i],   matrix[startX+i][endY] =
				matrix[endX-i][startY],   matrix[endX][endY-i],   matrix[startX+i][endY], matrix[startX][startY+i]
		}
		startX,startY,endX,endY = startX+1,startY+1,endX-1,endY-1
	}
	print(matrix)
}

func TestPrintMatrix(t *testing.T)  {
	matrix := [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
	printMatrix(matrix)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值