This commit is contained in:
Michael Zhang 2022-12-23 00:07:37 -06:00
parent 07ee5861d1
commit f7118bfb46
2 changed files with 134 additions and 0 deletions

93
py-ver/12.py Normal file
View file

@ -0,0 +1,93 @@
from queue import Queue
with open("12.txt") as f:
data = f.read()
ex_data = """Sabqponm
abcryxxl
accszExk
acctuvwj
abdefghi"""
def parse_data(data):
arr = dict()
for y, line in enumerate(data.splitlines()):
line = line.strip()
for x, c in enumerate(line):
if c == "S": start = (x, y); arr[x, y] = "a"
elif c == "E": end = (x, y); arr[x, y] = "z"
else: arr[x, y] = c
return arr, start, end
def solve1(data):
arr, start, end = parse_data(data)
q = Queue()
q.put((0, start))
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
v = dict()
while not q.empty():
# print(q.queue)
steps, (x, y) = q.get()
if (x, y) == end:
print(steps)
break
if (x, y) in v:
continue
v[x, y] = steps
height = arr[x, y]
for (dx, dy) in dirs:
neighbor = (x + dx, y + dy)
if neighbor not in arr: continue
if neighbor in v: continue
nheight = arr[neighbor]
if ord(nheight) - ord(height) <= 1:
q.put((steps + 1, neighbor))
# input()
def solve2(data):
arr, _, end = parse_data(data)
starts = set()
for coord, c in arr.items():
if c == "a": starts.add(coord)
min_dist = len(arr)
for start in starts:
q = Queue()
q.put((0, start))
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
v = dict()
while not q.empty():
# print(q.queue)
steps, (x, y) = q.get()
if (x, y) == end:
min_dist = min(min_dist, steps)
break
if (x, y) in v:
continue
v[x, y] = steps
height = arr[x, y]
for (dx, dy) in dirs:
neighbor = (x + dx, y + dy)
if neighbor not in arr: continue
if neighbor in v: continue
nheight = arr[neighbor]
if ord(nheight) - ord(height) <= 1:
q.put((steps + 1, neighbor))
print(min_dist)
solve1(ex_data)
solve1(data)
solve2(ex_data)
solve2(data)

41
py-ver/12.txt Normal file
View file

@ -0,0 +1,41 @@
abccccccccccccccccccaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaa
abcccccccccccccccaaaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaaa
abcaaccaacccccccccaaaaaaaaaacccccccccccccccccccccaaacccccccccccccaaaaa
abcaaaaaaccccccccaaaaaaaaaaaaacccccccccccccccccccaacccccccccccccaaaaaa
abcaaaaaacccaaacccccaaaaaaaaaaaccccccccccccccccccaaaccccccccccccccccaa
abaaaaaaacccaaaaccccaaaaaacaaaacccccccccccaaaacjjjacccccccccccccccccca
abaaaaaaaaccaaaaccccaaaaaaccccccaccccccccccaajjjjjkkcccccccccccccccccc
abaaaaaaaaccaaacccccccaaaccccccaaccccccccccajjjjjjkkkaaacccaaaccaccccc
abccaaacccccccccccccccaaccccaaaaaaaacccccccjjjjoookkkkaacccaaaaaaccccc
abcccaacccccccccccccccccccccaaaaaaaaccccccjjjjoooookkkkcccccaaaaaccccc
abcccccccaacccccccccccccccccccaaaacccccccijjjoooooookkkkccaaaaaaaccccc
abccaaccaaaccccccccccccccccccaaaaacccccciijjooouuuoppkkkkkaaaaaaaacccc
abccaaaaaaaccccccccccaaaaacccaacaaaccciiiiiooouuuuupppkkklllaaaaaacccc
abccaaaaaacccccccccccaaaaacccacccaaciiiiiiqooouuuuuupppkllllllacaccccc
abcccaaaaaaaacccccccaaaaaaccccaacaiiiiiqqqqoouuuxuuupppppplllllccccccc
abccaaaaaaaaaccaaaccaaaaaaccccaaaaiiiiqqqqqqttuxxxuuuppppppplllccccccc
abccaaaaaaaacccaaaaaaaaaaacccaaaahiiiqqqttttttuxxxxuuuvvpppplllccccccc
abcaaaaaaacccaaaaaaaaaaacccccaaaahhhqqqqtttttttxxxxuuvvvvvqqlllccccccc
abcccccaaaccaaaaaaaaaccccccccacaahhhqqqttttxxxxxxxyyyyyvvvqqlllccccccc
abcccccaaaccaaaaaaaacccccccccccaahhhqqqtttxxxxxxxyyyyyyvvqqqlllccccccc
SbcccccccccccaaaaaaaaaccccccccccchhhqqqtttxxxxEzzzyyyyvvvqqqmmlccccccc
abcccccccccccaaaaaaaacccaacccccccchhhppptttxxxxyyyyyvvvvqqqmmmcccccccc
abccccccccccaaaaaaaaaaccaacccccccchhhpppptttsxxyyyyyvvvqqqmmmccccccccc
abcaacccccccaaaaaaacaaaaaaccccccccchhhppppsswwyyyyyyyvvqqmmmmccccccccc
abaaaacccccccaccaaaccaaaaaaacccccccchhhpppsswwyywwyyyvvqqmmmddcccccccc
abaaaaccccccccccaaaccaaaaaaacccccccchhhpppsswwwwwwwwwvvqqqmmdddccccccc
abaaaacccccccccaaaccaaaaaaccccccccccgggpppsswwwwrrwwwwvrqqmmdddccccccc
abccccccaaaaaccaaaacaaaaaaccccccaacccggpppssswwsrrrwwwvrrqmmdddacccccc
abccccccaaaaaccaaaacccccaaccccaaaaaacggpppssssssrrrrrrrrrnmmdddaaccccc
abcccccaaaaaaccaaaccccccccccccaaaaaacggppossssssoorrrrrrrnnmdddacccccc
abcccccaaaaaaccccccccaaaaccccccaaaaacgggoooossoooonnnrrnnnnmddaaaacccc
abccccccaaaaaccccccccaaaacccccaaaaaccgggoooooooooonnnnnnnnndddaaaacccc
abccccccaaaccccccccccaaaacccccaaaaacccgggoooooooffennnnnnnedddaaaacccc
abcccccccccccccccccccaaacccccccaacccccggggffffffffeeeeeeeeeedaaacccccc
abccccccccccccccccccaaacccccaccaaccccccggfffffffffeeeeeeeeeecaaacccccc
abccccccccccccccccccaaaacccaaaaaaaaaccccfffffffaaaaaeeeeeecccccccccccc
abccccccccaacaaccccaaaaaacaaaaaaaaaaccccccccccaaaccaaaaccccccccccccccc
abccccccccaaaaacccaaaaaaaaaaacaaaaccccccccccccaaaccccaaccccccccccaaaca
abcccccccaaaaaccccaaaaaaaaaaacaaaaacccccccccccaaaccccccccccccccccaaaaa
abcccccccaaaaaacccaaaaaaaaaacaaaaaacccccccccccaaccccccccccccccccccaaaa
abcccccccccaaaaccaaaaaaaaaaaaaaccaaccccccccccccccccccccccccccccccaaaaa