-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path23.awk
87 lines (69 loc) · 1.26 KB
/
23.awk
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
gsub(/./, "& ")
for (x = 1; x <= NF; x++)
if ($x != "#")
maze[x, NR] = $x
}
END {
for (x = 1; x <= NF; x++) {
if ((x, 1) in maze)
start = x SUBSEP 1
if ((x, NR) in maze)
end = x SUBSEP NR
}
for (p in maze)
if (get_nbrs(p, nbrs1) != 2)
for (nbr in nbrs1)
condense(nbr, p)
print max_weight(start)
delete avoid
print max_weight(start)
}
function max_weight(n, w0, i, w, max) {
if (n == end)
return w0
seen[n]
for (i = 1; i <= nedges[n]; i++) {
if (edge[n, i] in seen || (n, i) in avoid)
continue
w = max_weight(edge[n, i], w0+weight[n, i])
if (w > max)
max = w
}
delete seen[n]
return max
}
function condense(e, n, prev, w, nbr, uphill) {
prev = n
for (w = 1; ; w++) {
if (get_nbrs(e, nbrs2) != 2)
break
for (nbr in nbrs2)
if (nbr != prev) {
prev = e
if (maze[prev] != "." && nbrs2[nbr] != maze[prev])
uphill = 1
e = nbr
break
}
}
nedges[n]++
edge[n, nedges[n]] = e
weight[n, nedges[n]] = w
if (uphill)
avoid[n, nedges[n]]
}
function get_nbrs(p, dst, x, y, nbr) {
split(p, tmp, SUBSEP)
x = tmp[1]
y = tmp[2]
delete dst
dst[x-1, y] = "<"
dst[x+1, y] = ">"
dst[x, y-1] = "^"
dst[x, y+1] = "v"
for (nbr in dst)
if (!(nbr in maze))
delete dst[nbr]
return length(dst)
}