#!/usr/bin/python
# -*- coding: utf-8 -*-
stone = [[5,9,6,7],[9,8,4,3],[6,4,2,1]]
gem = [[1,2],[3,4]]
def stone_str(stone, r, l, rlen):
return ''.join([str(i) for i in stone[r][l:l+rlen]])
def rotate0(gem, r):
res = ''
for i in gem[r]:
res += str(i)
return res
def rotate90(gem, r):
res = ''
for a in gem:
res = str(a[r]) + res
return res
def rotate180(gem, r):
res = ''
for i in gem[len(gem) - r - 1]:
res = str(i) + res
return res
def rotate270(gem, r):
res = ''
for a in gem:
res += str(a[len(a) - r - 1])
return res
def find_gem(v, glen, slen, func):
h = stone_str(stone, v, 0, slen).find(func(gem, 0))
if h != -1:
f = True
for j in range(1, glen):
if stone_str(stone, v + j, h, h + glen) != func(gem, j):
f = False
break
if f :
return h, v
return None
def open_door(stone, gem):
glen = len(gem[0])
slen = len(stone[0])
func_map = {rotate0: 0,rotate90: 90,rotate180: 180,rotate270: 270}
for v in range(len(stone) - len(gem) + 1):
for func in func_map.keys():
res = find_gem(v, glen, slen, func)
if res is not None:
return res[0], res[1], func_map[func]
return None
print(open_door(stone, gem))
不知道题主写出来没
def open_door(key, door):
n = 0 # 行
m = 0 # 列
# print('行数:{},列数:{}'.format(len(d), len(d[0])))
maxn = len(d)
maxm = len(d[0])
a = [x for x in key[0] + list(reversed(key[1]))] # 为了获取旋转坐标,反向拼接
angle = -1
while n < maxn - 1 and m < maxm - 1:
b = [x for x in door[n][m:m + 2] + list(reversed(door[n + 1][m:m + 2]))]
# print(b)
t = 0
j = 0
i = 0
for i in range(len(a)):
if a[i] == b[j]:
break
for u in range(4):
# print(a[(i + u) % 4],b[(j + u) % 4])
if a[(i + u) % 4] == b[(j + u) % 4]:
t += 1
else:
break
if t != 4:
if m < maxm - 2:
m += 1
elif n < maxn - 2:
m = 0
n += 1
else:
return None
continue
j = 0
for i, v in enumerate(a):
if v == b[j]:
j += 1
if angle == -1:
angle = i # 首次匹配正确是0度,第二次是90度
# print(b,n,m,angle*90)
return m, n, angle * 90
return None
k = [[1, 2],
[3, 4]]
d = [[5, 9, 6, 7],
[9, 8, 4, 3],
[6, 4, 2, 1]]
print(open_door(k, d))