81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
|
|
|
|
def f(inp):
|
|
def g(i, j, l):
|
|
old_i, old_j = i, j
|
|
visited.add((i, j))
|
|
if (i, j)==end:
|
|
paths.append(l)
|
|
else:
|
|
crossing = False
|
|
deadend = False
|
|
oi, oj = i, j
|
|
while not (crossing or deadend or (i, j)==end):
|
|
steps = []
|
|
for di, dj in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
|
|
if inp[i+di][j+dj] in '.v>':
|
|
steps.append((i+di, j+dj))
|
|
if len(steps)>2:
|
|
crossing = True
|
|
continue
|
|
if (oi, oj)!=steps[0]:
|
|
oi, oj = i, j
|
|
i, j = steps[0]
|
|
elif len(steps)==2:
|
|
oi, oj = i, j
|
|
i, j = steps[1]
|
|
else:
|
|
deadend = True
|
|
continue
|
|
l += 1
|
|
if deadend:
|
|
return
|
|
elif (i, j)==end:
|
|
g(i, j, l)
|
|
elif crossing and (i, j) not in visited:
|
|
for di, dj in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
|
|
if di==1 and inp[i+di][j+dj]=='v':
|
|
g(i+di, j+dj, l+1)
|
|
elif dj==1 and inp[i+di][j+dj]=='>':
|
|
g(i+di, j+dj, l+1)
|
|
visited.remove((old_i, old_j))
|
|
visited = set()
|
|
paths = []
|
|
inp = ['#'*len(inp[0])] + inp + ['#'*len(inp[0])]
|
|
si = 1
|
|
sj = inp[1].index('.')
|
|
end = (len(inp)-2, inp[-2].index('.'))
|
|
g(si, sj, 0)
|
|
return sorted(paths, reverse=True)
|
|
|
|
inp = '''
|
|
#.#####################
|
|
#.......#########...###
|
|
#######.#########.#.###
|
|
###.....#.>.>.###.#.###
|
|
###v#####.#v#.###.#.###
|
|
###.>...#.#.#.....#...#
|
|
###v###.#.#.#########.#
|
|
###...#.#.#.......#...#
|
|
#####.#.#.#######.#.###
|
|
#.....#.#.#.......#...#
|
|
#.#####.#.#.#########v#
|
|
#.#...#...#...###...>.#
|
|
#.#.#v#######v###.###v#
|
|
#...#.>.#...>.>.#.###.#
|
|
#####v#.#.###v#.#.###.#
|
|
#.....#...#...#.#.#...#
|
|
#.#########.###.#.#.###
|
|
#...###...#...#...#.###
|
|
###.###.#.###v#####v###
|
|
#...#...#.#.>.>.#.>.###
|
|
#.###.###.#.###.#.#v###
|
|
#.....###...###...#...#
|
|
#####################.#
|
|
'''.strip().split('\n')
|
|
|
|
assert f(inp)==[94, 90, 86, 82, 82, 74]
|
|
|
|
inp = open('input.txt').read().strip().split('\n')
|
|
print(max(f(inp)))
|