Go语言实现生成n阶顺时针循环矩阵

    自从看了清华尹成写了这么多博文,心中明白了一个道理猥琐男尹神成为大牛是有原因的。

所以想成为大牛先从模仿大神博文习惯开始。

    今天在CSDN上写第一篇博文《Go语言实现生成n阶循顺时针环矩阵》

如下图说明:

代码:

package main

import "strconv"

func main() {

   n := 10
   var rect [9999][9999]int  //这里 9999是先声明一个二维数组空间  这里代码不完美,如果n>=9999这里就不对了

   x := 0
   y := 1 // 当前遍历的位置
   px := 1
   py := 0 // x/y 在当前循环方向的增量
   var pn int
   pn = n // 该方向上还需要多少个数字(会递减,因为顺时针往里缩)
   var sum int
   sum = n // 当前遍历方向的终点位置

   /** 目标输出顺时针 */
   // 1  2  3  4  5
   // 16  17  18  19  6
   // 15  24  25  20  7
   // 14  23  22  21  8
   // 13  12  11  10  9

   /** 翻转矩阵为逆时针(为了便于后面逻辑处理,输出的时候再翻转回去) */
   // 1  16  15  14  13
   // 2  17  24  23  12
   // 3  18  25  22  11
   // 4  19  20  21  10
   // 5  6  7  8  9

   for i := 1; i <= n*n; i++ {
      // 翻转矩阵循环
      // 移到下一个点(第一次方向1->5 x增量为1, y的增量为0, 第二次方向为6->9,x增量为0,y增量为1,pn减少一个)
      x += px
      y += py
      rect[x][y] = i
      if i == sum { // 到达该方向的最后一个点
         if px == 1 || px == -1 { // x的增量不为0,则为竖向 -> 横向
            pn = pn - 1 // 竖向变为横向的时候,该方向上数字的个数会减少一个
            sum = sum + pn
            py = px
            px = 0
         } else { // x的增量为0, y的增量不为0,则为横向 -> 竖向
            sum = sum + pn
            px = -py
            py = 0
         }
      }
   }

   for i := 1; i <= n; i++ {
      for j := 1; j <= n; j++ {
         print(strconv.Itoa(rect[j][i]) +"  ") //strconv.Itoa 将int类型转为字符串 翻转复原输出
      }
      println("")
   }
}

输出结果:

阅读更多
个人分类: GO语言
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭