Python 解螺旋数组
2017-07-12 本文已影响160人
zaijianbali
最近闲的时候看python,想想看了几天,也需要实践一下;
以下是摘自微信公众号
Crossin的编程教室
【每周一坑】罗马数组转换
N 为 4 的螺旋数组如图所示:
螺旋数组输入一个正整数 N,输出以 N 为边长的螺旋矩阵。(比如上图就是 N 为 4 的结果)
其实所有的方案都是直接摘抄下来的,算是写的第一个python程序吧。
#coding=UTF-8
#解决python end = ‘ ’ 在2.x上的兼容问题
from __future__ import print_function
class Spiral:
def __init__(self, N):
#构造一个二维数组
self.matrix = [[None for i in range(N)] for j in range(N)]
#起始位置
self.row = 0
self.col = 0
#数组的边界值
self.max_row = N
#更换方向标记
self.mark = 0
#获取数组的运动方向
def direction(self, mark):
around = [
[self.row, self.col+1], #向右
[self.row+1, self.col], #向下
[self.row, self.col-1], #向左
[self.row-1, self.col] #向上
]
return around[mark%4]
#根据当前位置,获取下一个位置
# 如果是边界更换方向
# 如果下一个元素已经有了同样也要更换方向
def next(self):
#获取下一个位置
i = self.direction(mark=self.mark)
#判断是不是赋值和越界,如果没有,赋值螺旋数组上的数组位置值
if -1 not in i and self.max_row not in i:
if self.matrix[i[0]][i[1]] is None:
#赋值self.row = i[0],self.col = i[1]
self.row,self.col = i
return None
#更换方向
self.mark +=1
return self.next()
def solution(self):
for i in range(1,self.max_row**2+1):
#行列赋值
self.matrix[self.row][self.col] = i
#结束
if i == self.max_row**2:
break
self.next()
#打印结果
for r in self.matrix:
for c in r:
print('{0:^{1}}'.format(c,4),end = ' ')
print('\n')
def solution2(self):
n = self.max_row;
#对二维数组赋值
a = [[0 for i in range(1, n+1)] for j in range(1,n+1)]
x, y, i, j = 0, 0, 0, 0
while a[i][j] == 0:
y += 1
a[i][j] = y
#方向:right,可以向右移动(j< n-1) 并且 右侧的一个位置没有赋值( a[i][j+1] == 0)
#是第一行或者(不是第一行但上一行已经有值了)
if j < n-1 and a[i][j+1] == 0 and (i == 0 or i > 0 and a[i-1][j] != 0):
j += 1
#方向:down,可以向下移动(i < n-1)并且 下侧的位置没有赋值(a[i+1][j] == 0)
elif i < n-1 and a[i+1][j] == 0:
i += 1
#方向:left,可以向左移动(j > 0)并且 左侧的位置没有赋值(a[i][j-1] == 0)
elif j > 0 and a[i][j-1] == 0:
j -= 1
#方向:up,可以向上移动(i > 0)并且 左侧的位置没有赋值(a[i-1][j] == 0)
elif i > 0 and a[i-1][j] == 0:
i -= 1
#打印
for b in a:
for c in b:
print('{0:^{1}}'.format(c, 4), end = ' ')
print('\n')
if __name__ == '__main__':
n = int(input(' 输入螺旋数组最大行数 \n >>> '))
s = Spiral(n)
#方案1
#s.solution()
#方案2
s.solution2()