@@ -12,32 +12,36 @@ import (
12
12
13
13
const (
14
14
CORRUPTED = - 1
15
+ UNIVSITED = 0
15
16
)
16
17
17
18
func printSpace (space [][]int ) {
19
+ var max = len (space ) - 1
18
20
for y := range space {
19
21
for x := range space [y ] {
20
- fmt .Printf ("%2d " , space [y ][x ])
22
+ switch space [y ][x ] {
23
+ case CORRUPTED :
24
+ fmt .Print (" C" )
25
+ case UNIVSITED :
26
+ fmt .Print (" ." )
27
+ default :
28
+ fmt .Printf ("%2d" , space [y ][x ])
29
+ }
30
+ if max > 9 {
31
+ fmt .Print (" " )
32
+ }
21
33
}
22
34
fmt .Println ()
23
35
}
24
36
fmt .Println ()
25
37
}
26
38
27
- func main () {
28
- var size = flag .Int ("max" , 70 , "coordinates have range [0,max]" )
29
- var count = flag .Int ("count" , 1024 , "number of bytes that have fallen" )
30
- flag .Parse ()
31
- var space = make ([][]int , * size + 1 )
32
- for y := range space {
33
- space [y ] = make ([]int , * size + 1 )
34
- }
35
-
39
+ func readSpace (space [][]int , count int ) {
36
40
var scanner = bufio .NewScanner (os .Stdin )
37
41
var pattern = regexp .MustCompile (`^(\d+),(\d+)$` )
38
42
39
43
var fallen int
40
- for scanner .Scan () && fallen < * count {
44
+ for scanner .Scan () && fallen < count {
41
45
var line = scanner .Text ()
42
46
var matches = pattern .FindStringSubmatch (line )
43
47
var x , y int
@@ -52,6 +56,60 @@ func main() {
52
56
fmt .Fprintf (os .Stderr , "Error: %s\n " , err )
53
57
os .Exit (1 )
54
58
}
59
+ }
55
60
61
+ func makeSpace (size int ) [][]int {
62
+ var space = make ([][]int , size + 1 )
63
+ for y := range space {
64
+ space [y ] = make ([]int , size + 1 )
65
+ }
66
+ return space
67
+ }
68
+
69
+ var directions = []util.Point {{X : - 1 , Y : 0 }, {X : 1 , Y : 0 }, {X : 0 , Y : 1 }, {X : 0 , Y : - 1 }}
70
+
71
+ func markAround (from util.Point , space [][]int , set []util.Point ) []util.Point {
72
+ var size = len (space )
73
+ var steps = space [from.Y ][from.X ]
74
+ for _ , direction := range directions {
75
+ var to = from .Add (direction )
76
+ if to .IsInBounds (size , size ) && space [to.Y ][to.X ] == 0 {
77
+ set = append (set , to )
78
+ space [to.Y ][to.X ] = steps + 1
79
+ }
80
+ }
81
+ return set
82
+ }
83
+
84
+ func expandSet (set []util.Point , space [][]int ) []util.Point {
85
+ var newset = []util.Point {}
86
+ for _ , point := range set {
87
+ newset = markAround (point , space , newset )
88
+ }
89
+ return newset
90
+ }
91
+
92
+ func searchPath (space [][]int ) int {
93
+ var max = len (space ) - 1
94
+ var set []util.Point = []util.Point {{X : 0 , Y : 0 }}
95
+
96
+ space [0 ][0 ] = 1
97
+ for space [max ][max ] == 0 && len (set ) > 0 {
98
+ set = expandSet (set , space )
99
+ }
100
+
101
+ return space [max ][max ]
102
+ }
103
+
104
+ func main () {
105
+ var max = flag .Int ("max" , 70 , "coordinates have range [0,max]" )
106
+ var count = flag .Int ("count" , 1024 , "number of bytes that have fallen" )
107
+ flag .Parse ()
108
+
109
+ var space = makeSpace (* max )
110
+ readSpace (space , * count )
111
+ printSpace (space )
112
+ var steps = searchPath (space ) - 1
113
+ fmt .Printf ("found exit in %d steps\n " , steps )
56
114
printSpace (space )
57
115
}
0 commit comments