-
Notifications
You must be signed in to change notification settings - Fork 6
/
unlockpattern2.py
36 lines (34 loc) · 1.34 KB
/
unlockpattern2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
s = input()
turn = [[[None]*9 for _ in range(9)] for _ in range(9)]
for i in range(9):
for j in range(9):
if i == j: continue
for k in range(9):
if k == i or k == j: continue
aa, bb, cc, dd = j//3-i//3, j%3-i%3, k//3-j//3, k%3-j%3
if (cross:=aa*dd-bb*cc) > 0: turn[i][j][k] = 'L'
elif cross < 0: turn[i][j][k] = 'R'
elif (dot:=aa*cc+bb*dd) > 0: turn[i][j][k] = 'S'
else: turn[i][j][k] = 'A'
jump = [[None]*9 for _ in range(9)]
jump[2][6] = jump[6][2] = jump[0][8] = jump[8][0] = jump[3][5] = jump[5][3] = jump[1][7] = jump[7][1] = 4
jump[0][2] = jump[2][0] = 1
jump[6][8] = jump[8][6] = 7
jump[0][6] = jump[6][0] = 3
jump[2][8] = jump[8][2] = 5
# itertools.permutations will TLE, you can prune using recursion
ans = [0]
def solve(used=[0]*9, p=[]):
if len(p) == 9:
ok = 1
for i in range(7):
if s[i] == '?': continue
elif turn[p[i]][p[i+1]][p[i+2]] != s[i]: ok = 0; break
ans[0] += ok
else:
for i in range(9):
if not used[i] and (len(p) < 2 or (j:=jump[p[-1]][p[-2]]) == None or used[j]):
used[i] = 1; p.append(i)
solve(used, p)
used[i] = 0; p.pop()
solve(), print(ans[0])