@@ -135,53 +135,18 @@ func main() {
135
135
136
136
total := 0
137
137
for i := 0 ; i < len (bricks ); i ++ {
138
- newBricks := append ([]brick {}, bricks [:i ]... )
139
- newBricks = append (newBricks , bricks [i + 1 :]... )
140
- count := restack (newBricks )
141
- total += count
142
- }
143
-
144
- fmt .Println (total )
145
- }
146
-
147
- func restack (bricks []brick ) int {
148
- moved := make (map [int ]struct {})
149
- for i := 0 ; i < len (bricks ); i ++ {
150
- if bricks [i ].start .z == 1 {
151
- continue
152
- }
138
+ removed := []int {i }
139
+ closed := []int {}
140
+ count := 0
141
+ cascade (bricks , i , supportedBy , & removed , & closed , & count )
153
142
154
- // check if the brick can move down
155
- for {
156
- testZ := bricks [i ].start .z - 1
157
- canMove := true
158
- for j := 0 ; j < i ; j ++ {
159
- if bricks [j ].end .z >= testZ {
160
- if intersect (bricks [i ], bricks [j ]) {
161
- canMove = false
162
- }
163
- }
164
- }
165
-
166
- if ! canMove {
167
- break
168
- }
169
-
170
- bricks [i ].start .z --
171
- bricks [i ].end .z --
172
-
173
- moved [i ] = struct {}{}
174
-
175
- if bricks [i ].start .z == 1 {
176
- break
177
- }
178
- }
143
+ total += (count - 1 )
179
144
}
180
145
181
- return len ( moved )
146
+ fmt . Println ( total )
182
147
}
183
148
184
- func cascade (bricks []brick , b int , supportedBy map [int ][]int , removed []int , closed * []int , count * int ) {
149
+ func cascade (bricks []brick , b int , supportedBy map [int ][]int , removed * []int , closed * []int , count * int ) {
185
150
if slices .Contains (* closed , b ) {
186
151
return
187
152
}
@@ -193,20 +158,19 @@ func cascade(bricks []brick, b int, supportedBy map[int][]int, removed []int, cl
193
158
// check if all of the blocks support has been removed
194
159
allRemoved := true
195
160
for _ , by := range supportedBy [support ] {
196
- if ! slices .Contains (removed , by ) {
161
+ if ! slices .Contains (* removed , by ) {
197
162
allRemoved = false
198
163
break
199
164
}
200
165
}
201
166
202
167
if allRemoved {
203
- removed = append (removed , support )
168
+ * removed = append (* removed , support )
204
169
cascadeTo = append (cascadeTo , support )
205
170
}
206
171
}
207
172
208
173
* closed = append (* closed , b )
209
-
210
174
for _ , c := range cascadeTo {
211
175
cascade (bricks , c , supportedBy , removed , closed , count )
212
176
}
0 commit comments