|
发表于 2018-2-10 18:02:36
|
显示全部楼层
好难啊,虽然自己分析一下结果就出来了,可是不知道怎么编程实现,好不容易实现了,但用得方法实在太复杂,只能处理2*2,3*3的,再大就处理不了了。
等高手的答案。智商还是不够用……
- def is_ordering(list1):
- for sub in list1:
- for i in range(len(sub)-1):
- if sub[i+1] <= sub[i]:
- return False
- else:
- return True
- def col_trans(list1):
- l = len(list1)
- w = len(list1[0])
- tmp = [[0 for i in range(l)] for i in range(w)]
- for i in range(l):
- for j in range(w):
- tmp[j][i] = list1[i][j]
- return tmp
- # list1是一个行列相等的二维列表, direction是列表旋转方向,True为逆时针旋转90度,False为顺时针旋转90度,为了题目从后往前取
- def rotate(list1, direction):
- l = len(list1)
- n = 2*l-1
- tmp = []
- if direction:
- for i in range(l):
- tmp.append([list1[j][l - 1 - (i - j)] for j in range(i + 1)])
- for i in range(n-l):
- tmp.append([list1[j + i + 1][j] for j in range(n - l - i)])
- return tmp
- else:
- for i in range(l):
- tmp.append([list1[j][i - j] for j in range(i + 1)])
- for i in range(n-l):
- tmp.append([list1[j + i + 1][l - 1 - j] for j in range(n - l - i)])
- return tmp
- from itertools import permutations
- perms = list(permutations(range(9), 9))
- for per in perms:
- n = round(len(perms[0]) ** 0.5)
- tmp = [per[j * n:j * n + n] for j in range(len(per) // n)]
- if is_ordering(tmp) and is_ordering(col_trans(tmp)) and \
- is_ordering(rotate(tmp, True)) and is_ordering(rotate(tmp, False)):
- print(tmp)
复制代码
结果:
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
[(0, 1, 2), (3, 4, 6), (5, 7, 8)]
[(0, 1, 3), (2, 4, 5), (6, 7, 8)]
[(0, 1, 3), (2, 4, 6), (5, 7, 8)] |
评分
-
查看全部评分
|