@@ -19,43 +19,63 @@ func printSpace(space [][]int) {
19
19
var max = len (space ) - 1
20
20
for y := range space {
21
21
for x := range space [y ] {
22
+ var val string
22
23
switch space [y ][x ] {
23
24
case CORRUPTED :
24
- fmt . Print ( " C" )
25
+ val = "C"
25
26
case UNIVSITED :
26
- fmt . Print ( " ." )
27
+ val = "."
27
28
default :
28
- fmt . Printf ( "%2d" , space [y ][x ])
29
+ val = util . Itoa ( space [y ][x ])
29
30
}
30
31
if max > 9 {
31
- fmt .Print (" " )
32
+ fmt .Printf ("%3s " , val )
33
+ } else {
34
+ fmt .Printf ("%2s" , val )
32
35
}
33
36
}
34
37
fmt .Println ()
35
38
}
36
39
fmt .Println ()
37
40
}
38
41
39
- func readSpace ( space [][] int , count int ) {
42
+ func readPoints () []util. Point {
40
43
var scanner = bufio .NewScanner (os .Stdin )
41
44
var pattern = regexp .MustCompile (`^(\d+),(\d+)$` )
42
45
43
- var fallen int
44
- for scanner .Scan () && fallen < count {
46
+ var points = []util. Point {}
47
+ for scanner .Scan () {
45
48
var line = scanner .Text ()
46
49
var matches = pattern .FindStringSubmatch (line )
47
50
var x , y int
48
51
if len (matches ) > 0 {
49
52
x = util .Atoi (matches [1 ])
50
53
y = util .Atoi (matches [2 ])
51
- space [y ][x ] = CORRUPTED
52
- fallen ++
54
+ points = append (points , util.Point {Y : y , X : x })
53
55
}
54
56
}
55
57
if err := scanner .Err (); err != nil {
56
58
fmt .Fprintf (os .Stderr , "Error: %s\n " , err )
57
59
os .Exit (1 )
58
60
}
61
+
62
+ return points
63
+ }
64
+
65
+ func resetSpace (space [][]int ) {
66
+ for y := range space {
67
+ for x := range space [y ] {
68
+ if space [y ][x ] > 0 {
69
+ space [y ][x ] = 0
70
+ }
71
+ }
72
+ }
73
+ }
74
+
75
+ func fillSpace (space [][]int , points []util.Point ) {
76
+ for _ , point := range points {
77
+ space [point.Y ][point.X ] = CORRUPTED
78
+ }
59
79
}
60
80
61
81
func makeSpace (size int ) [][]int {
@@ -106,10 +126,20 @@ func main() {
106
126
var count = flag .Int ("count" , 1024 , "number of bytes that have fallen" )
107
127
flag .Parse ()
108
128
129
+ var points = readPoints ()
109
130
var space = makeSpace (* max )
110
- readSpace (space , * count )
131
+ fillSpace (space , points [: * count ] )
111
132
printSpace (space )
112
133
var steps = searchPath (space ) - 1
113
134
fmt .Printf ("found exit in %d steps\n " , steps )
114
135
printSpace (space )
136
+
137
+ for _ , point := range points [* count :] {
138
+ resetSpace (space )
139
+ fillSpace (space , []util.Point {point })
140
+ if searchPath (space ) == 0 {
141
+ fmt .Printf ("no way out at coordinate %d,%d\n " , point .X , point .Y )
142
+ break
143
+ }
144
+ }
115
145
}
0 commit comments