Spaces:
Running
Running
| from collections import deque | |
| def solve(): | |
| file = "input.txt" | |
| grid = [] | |
| with open(file, 'r') as f: | |
| for line in f: | |
| grid.append([int(x) for x in line.strip()]) | |
| rows = len(grid) | |
| cols = len(grid[0]) | |
| def get_neighbors(r, c): | |
| neighbors = [] | |
| for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]: | |
| nr, nc = r + dr, c + dc | |
| if 0 <= nr < rows and 0 <= nc < cols: | |
| neighbors.append((nr, nc)) | |
| return neighbors | |
| def dfs_score(r, c): | |
| score = 0 | |
| visited = set() | |
| stack = [(r, c)] | |
| while stack: | |
| curr_r, curr_c = stack.pop() | |
| if (curr_r, curr_c) in visited: | |
| continue | |
| visited.add((curr_r, curr_c)) | |
| if grid[curr_r][curr_c] == 9: | |
| score += 1 | |
| continue | |
| for nr, nc in get_neighbors(curr_r, curr_c): | |
| if grid[nr][nc] == grid[curr_r][curr_c] + 1: | |
| stack.append((nr, nc)) | |
| return score | |
| def dfs_rating(r, c): | |
| rating = 0 | |
| stack = [([(r, c)], set())] | |
| while stack: | |
| path, visited = stack.pop() | |
| curr_r, curr_c = path[-1] | |
| if grid[curr_r][curr_c] == 9: | |
| rating += 1 | |
| continue | |
| for nr, nc in get_neighbors(curr_r, curr_c): | |
| if grid[nr][nc] == grid[curr_r][curr_c] + 1 and (nr, nc) not in visited: | |
| new_path = path + [(nr, nc)] | |
| new_visited = set(visited) | |
| new_visited.add((nr,nc)) | |
| stack.append((new_path, new_visited)) | |
| return rating | |
| total_score = 0 | |
| total_rating = 0 | |
| for r in range(rows): | |
| for c in range(cols): | |
| if grid[r][c] == 0: | |
| total_score += dfs_score(r, c) | |
| total_rating += dfs_rating(r, c) | |
| print(total_score) | |
| print(total_rating) | |
| solve() |