@@ -12,32 +12,36 @@ import (
1212
1313const (
1414 CORRUPTED = - 1
15+ UNIVSITED = 0
1516)
1617
1718func printSpace (space [][]int ) {
19+ var max = len (space ) - 1
1820 for y := range space {
1921 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+ }
2133 }
2234 fmt .Println ()
2335 }
2436 fmt .Println ()
2537}
2638
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 ) {
3640 var scanner = bufio .NewScanner (os .Stdin )
3741 var pattern = regexp .MustCompile (`^(\d+),(\d+)$` )
3842
3943 var fallen int
40- for scanner .Scan () && fallen < * count {
44+ for scanner .Scan () && fallen < count {
4145 var line = scanner .Text ()
4246 var matches = pattern .FindStringSubmatch (line )
4347 var x , y int
@@ -52,6 +56,60 @@ func main() {
5256 fmt .Fprintf (os .Stderr , "Error: %s\n " , err )
5357 os .Exit (1 )
5458 }
59+ }
5560
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 )
56114 printSpace (space )
57115}
0 commit comments