1
1
// https://atcoder.jp/contests/abc151/tasks/abc151_d
2
2
3
3
use ndarray:: Array ;
4
- use smallvec:: { smallvec , SmallVec } ;
4
+ use smallvec:: SmallVec ;
5
5
6
- use std:: collections:: VecDeque ;
7
6
use std:: io:: { self , Read } ;
8
- use std:: iter;
7
+ use std:: { iter, mem } ;
9
8
10
9
fn main ( ) {
11
10
let mut input = read_to_static ( io:: stdin ( ) ) . split_whitespace ( ) ;
@@ -17,28 +16,28 @@ fn main() {
17
16
( { Maze <$c: literal, ( $h: expr, $w: expr) > } ) => {
18
17
Array :: from_shape_vec(
19
18
( $h, $w) ,
20
- ( 0 ..$h)
21
- . fold( vec![ ] , |mut acc, _| {
22
- acc. extend( input. next( ) . unwrap( ) . bytes( ) . map( |c| c == $c) ) ;
23
- acc
24
- } ) ,
19
+ itertools:: concat( ( 0 ..$h) . map( |_| read!( { Row <$c> } ) ) ) ,
25
20
)
26
21
. unwrap( )
27
22
} ;
23
+ ( { Row <$c: literal> } ) => {
24
+ read!( { Bytes } ) . into_iter( ) . map( |c| c == $c) . collect:: <Vec <_>>( )
25
+ } ;
26
+ ( { Bytes } ) => {
27
+ read!( String ) . into_bytes( )
28
+ } ;
28
29
}
29
30
30
31
let ( h, w) = read ! ( ( usize , usize ) ) ;
31
32
let maze = read ! ( { Maze <b'.' , ( h, w) > } ) ;
32
33
33
- let neighbors = Array :: from_shape_fn ( ( h, w) , |( i, j) | -> SmallVec < [ _ ; 4 ] > {
34
- let mut neighbors = smallvec ! [ ] ;
35
- macro_rules! push {
36
- ( if $cond: expr => $pos: expr) => {
37
- if $cond && maze[ $pos] {
38
- neighbors. push( $pos) ;
39
- }
40
- } ;
41
- }
34
+ let neighbors = Array :: from_shape_fn ( ( h, w) , |( i, j) | {
35
+ let mut neighbors = SmallVec :: < [ _ ; 4 ] > :: new ( ) ;
36
+ macro_rules! push( ( if $cond: expr => $pos: expr) => {
37
+ if $cond && maze[ $pos] {
38
+ neighbors. push( $pos) ;
39
+ }
40
+ } ) ;
42
41
push ! ( if 0 < i => ( i - 1 , j) ) ;
43
42
push ! ( if i < h - 1 => ( i + 1 , j) ) ;
44
43
push ! ( if 0 < j => ( i, j - 1 ) ) ;
@@ -50,21 +49,21 @@ fn main() {
50
49
. flat_map ( |i| ( 0 ..w) . map ( move |j| ( i, j) ) )
51
50
. filter ( |& p| maze[ p] )
52
51
. map ( |start| {
53
- let mut longest = 0 ;
54
- let mut queue = iter:: once ( ( start, 0 ) ) . collect :: < VecDeque < _ > > ( ) ;
52
+ let mut queue = vec ! [ start] ;
55
53
let mut unvisited = maze. clone ( ) ;
56
54
unvisited[ start] = false ;
57
55
58
- while let Some ( ( pos, dist) ) = queue. pop_front ( ) {
59
- for & neighbor in & neighbors[ pos] {
60
- if unvisited[ neighbor] {
61
- unvisited[ neighbor] = false ;
62
- longest = dist + 1 ;
63
- queue. push_back ( ( neighbor, longest) ) ;
64
- }
65
- }
66
- }
67
- longest
56
+ iter:: repeat ( ( ) )
57
+ . take_while ( |_| {
58
+ queue = queue
59
+ . iter ( )
60
+ . flat_map ( |& p| & neighbors[ p] )
61
+ . copied ( )
62
+ . filter ( |& p| mem:: replace ( & mut unvisited[ p] , false ) )
63
+ . collect ( ) ;
64
+ !queue. is_empty ( )
65
+ } )
66
+ . count ( )
68
67
} )
69
68
. max ( )
70
69
. unwrap ( ) ;
0 commit comments