Python-打印螺旋矩阵

  • 问题描述

输入N, 打印 N*N 螺旋矩阵
比如 N = 3,打印:
1 2 3
8 9 4
7 6 5

N = 4,打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

  • 思路

常规法是不断的对数据边界进行判断会很复杂,不妨考虑通过递归的解决每一层的数字。

  • 代码
n = int(raw_input('>'))
#初始化数组
arr = [[0]*n for i in range(n)]
#递归解决
def dfs(arr, x, y, start, n):
    if n<=0:return 0
    if n==1:
        arr[x][y] = start
        return 0
    #up
    for i in range(n):
        arr[x][y+i] = start
        start += 1
    #right
    for i in range(n-1):
        arr[x+1+i][y+n-1] = start
        start += 1
    #down
    for i in range(n-1):
        arr[x+n-1][y+n-2-i] = start
        start += 1
    #left
    for i in range(n-2):
        arr[x+n-2-i][y] = start
        start += 1
    dfs(arr,x+1,y+1,start,n-2)

a = dfs(arr,0,0,1,n)
#格式化输出print
l = len(str(n*n))+1
format = ('%'+str(l)+'d')*n
for tmp in arr:
    print format%tuple(tmp) 
  • 运行结果
derek@ubuntu:~/Desktop/python-learn/aril$ python circle2.py 
>5
  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
derek@ubuntu:~/Desktop/python-learn/aril$ python circle2.py 
>15
   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  56  57  58  59  60  61  62  63  64  65  66  67  68  69  16
  55 104 105 106 107 108 109 110 111 112 113 114 115  70  17
  54 103 144 145 146 147 148 149 150 151 152 153 116  71  18
  53 102 143 176 177 178 179 180 181 182 183 154 117  72  19
  52 101 142 175 200 201 202 203 204 205 184 155 118  73  20
  51 100 141 174 199 216 217 218 219 206 185 156 119  74  21
  50  99 140 173 198 215 224 225 220 207 186 157 120  75  22
  49  98 139 172 197 214 223 222 221 208 187 158 121  76  23
  48  97 138 171 196 213 212 211 210 209 188 159 122  77  24
  47  96 137 170 195 194 193 192 191 190 189 160 123  78  25
  46  95 136 169 168 167 166 165 164 163 162 161 124  79  26
  45  94 135 134 133 132 131 130 129 128 127 126 125  80  27
  44  93  92  91  90  89  88  87  86  85  84  83  82  81  28
  43  42  41  40  39  38  37  36  35  34  33  32  31  30  29
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值