分析:
1.首先矩阵对应一个二维数组,所以我们要定义一个二维数组a
2.矩阵边长为l
=n,最大值为l x l
3.填充数组a[x,y],确定起始位置,我选择从a[0,0]
开始
4.填上边 a[0,0]
,a[0,1]
,a[0,2]
...a[0,l-1]
每次y++
5.填右边 a[0,l-1]
,a[1,l-1]
...a[l-1,l-1]
每次x++
6.填下边 a[l-1,l-2]
,a[l-1,l-3]
...a[l-1,0]
每次y--
7.填左边 a[l-2,0]
,a[l-3,0]
...a[0,1]
每次x--
8.循环4、5、6、7,l x l个数全填完结束
从中心顺时针打印
func matrix(n int) {
/*
n=5
从里向外顺时针打印 坐标
25 10 11 12 13 0,0 0,1 0,2 0,3 0,4
24 9 2 3 14 1,0 1,1 1,2 1,3 1,4
23 8 1 4 15 2,0 2,1 2,2 2,3 2,4
22 7 6 5 16 3,0 3,1 3,2 3,3 3,4
21 20 19 18 17 4,0 4,1 4,2 4,3 4,4
*/
l := n //边长度
num := l * l //矩阵最大值
a := make([][]int, l) //初始化二维数组
for key := range a {
a[key] = make([]int, l)
}
x := 0 //坐标0,0开始填充数组
y := 0
for num > 0 { //num递减填充到a,到1结束
for x < l && a[x][y] == 0 { //填充左边,注意越界和填充完一圈后不要覆盖已填充的值
a[x][y] = num
x++
num--
}
x-- //x==边长x自增了,需要减1
y++ //左下角已填入,从y+1开始填充下边
for y < l && a[x][y] == 0 { //填充下边
a[x][y] = num
y++
num--
}
y--
x--
for 0 <= x && a[x][y] == 0 { //填充右边,填充到0结束
a[x][y] = num
x--
num--
}
x++
y--
for 0 <= y && a[x][y] == 0 { //填充上边
a[x][y] = num
y--
num--
}
y++
x++
}
//打印结果
for i := 0; i < len(a[0]); i++ {
for j := 0; j < len(a[0]); j++ {
fmt.Printf("%2d%s", a[i][j], " ")
}
fmt.Println()
}
//打印坐标
for i := 0; i < len(a[0]); i++ {
for j := 0; j < len(a[0]); j++ {
fmt.Printf("%d%s%d%s", i, ",", j, " ")
}
fmt.Println()
}
}
从左上角顺时针打印
func matrix(n int) {
/*
n=5
从外向内顺时针打印 坐标
1 2 3 4 5 0,0 0,1 0,2 0,3 0,4
16 17 18 19 6 1,0 1,1 1,2 1,3 1,4
15 24 25 20 7 2,0 2,1 2,2 2,3 2,4
14 23 22 21 8 3,0 3,1 3,2 3,3 3,4
13 12 11 10 9 4,0 4,1 4,2 4,3 4,4
*/
l := n //边长度
num := 1 //矩阵初始值
a := make([][]int, l) //初始化二维数组
for key := range a {
a[key] = make([]int, l)
}
x := 0 //坐标0,0开始填充数组
y := 0
for num <= l*l { //num递增填充到a,最大值l*l
for y < l && a[x][y] == 0 { //填充上边
a[x][y] = num
y++
num++
}
y--
x++
for x < l && a[x][y] == 0 { //填充右边
a[x][y] = num
x++
num++
}
x--
y--
for 0 <= y && a[x][y] == 0 { //填充下边
a[x][y] = num
y--
num++
}
y++
x--
for 0 <= x && a[x][y] == 0 { //填充左边
a[x][y] = num
x--
num++
}
x++
y++
}
//打印结果
for i := 0; i < len(a[0]); i++ {
for j := 0; j < len(a[0]); j++ {
fmt.Printf("%2d%s", a[i][j], " ")
}
fmt.Println()
}
//打印坐标
for i := 0; i < len(a[0]); i++ {
for j := 0; j < len(a[0]); j++ {
fmt.Printf("%d%s%d%s", i, ",", j, " ")
}
fmt.Println()
}
}