@@ -118,9 +118,7 @@ pub fn parse(input: &str) -> u32 {
118118 if non_empty && pair == PAIR1 {
119119 steps += 12 ;
120120 } else {
121- if ( pair & PAIR1 ) != 0 {
122- non_empty = true ;
123- }
121+ non_empty |= pair & PAIR1 != 0 ;
124122 floors[ i] = pair;
125123 i += 1 ;
126124 }
@@ -155,6 +153,16 @@ fn bfs(start: State, steps: u32) -> u32 {
155153
156154 // Iterate over items that can be moved.
157155 let items = state. pairs & ( FLOOR1 << state. elevator ) ;
156+ let mut push = |up : bool , mask : u64 | -> bool {
157+ if let Some ( next) = state. move_floor ( up, mask)
158+ && seen. insert ( next)
159+ {
160+ todo. push_back ( ( next, steps + 1 ) ) ;
161+ true
162+ } else {
163+ false
164+ }
165+ } ;
158166
159167 // When moving down, try one item first; try two only if one didn't work.
160168 // Don't move down from bottom floor, or down into empty region.
@@ -165,22 +173,12 @@ fn bfs(start: State, steps: u32) -> u32 {
165173 let mut added = false ;
166174
167175 for i in items. biterator ( ) {
168- if let Some ( next) = state. move_floor ( false , 1 << i)
169- && seen. insert ( next)
170- {
171- added = true ;
172- todo. push_back ( ( next, steps + 1 ) ) ;
173- }
176+ added |= push ( false , 1 << i) ;
174177 }
175-
176178 if !added {
177179 for i in items. biterator ( ) {
178180 for j in items. biterator ( ) . take_while ( |& j| j < i) {
179- if let Some ( next) = state. move_floor ( false , ( 1 << i) | ( 1 << j) )
180- && seen. insert ( next)
181- {
182- todo. push_back ( ( next, steps + 1 ) ) ;
183- }
181+ push ( false , ( 1 << i) | ( 1 << j) ) ;
184182 }
185183 }
186184 }
@@ -193,22 +191,12 @@ fn bfs(start: State, steps: u32) -> u32 {
193191
194192 for i in items. biterator ( ) {
195193 for j in items. biterator ( ) . take_while ( |& j| j < i) {
196- if let Some ( next) = state. move_floor ( true , ( 1 << i) | ( 1 << j) )
197- && seen. insert ( next)
198- {
199- added = true ;
200- todo. push_back ( ( next, steps + 1 ) ) ;
201- }
194+ added |= push ( true , ( 1 << i) | ( 1 << j) ) ;
202195 }
203196 }
204-
205197 if !added {
206198 for i in items. biterator ( ) {
207- if let Some ( next) = state. move_floor ( true , 1 << i)
208- && seen. insert ( next)
209- {
210- todo. push_back ( ( next, steps + 1 ) ) ;
211- }
199+ push ( true , 1 << i) ;
212200 }
213201 }
214202 }
0 commit comments