CSES - Datatähti 2022 loppu - Results
Submission details
Task:Sokkelo
Sender:xnor
Submission time:2022-01-22 14:47:59 +0200
Language:Rust
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
Test results
testverdicttimegroup
#10.01 s1, 2details
#20.01 s1, 2details
#30.01 s1, 2details
#40.01 s2details
#50.01 s2details
#60.01 s2details
#70.01 s1, 2details
#80.01 s2details
#90.01 s2details
#100.01 s1, 2details
#110.01 s2details
#120.01 s1, 2details
#130.01 s2details
#140.01 s1, 2details
#150.01 s2details
#160.01 s2details
#170.01 s2details

Compiler report

warning: value assigned to `neighbors_b` is never read
   --> input/code.rs:166:9
    |
166 |         neighbors_b = new_neighbors_b;
    |         ^^^^^^^^^^^
    |
    = note: `#[warn(unused_assignments)]` on by default
    = help: maybe it is overwritten before being read?

warning: variable does not need to be mutable
   --> input/code.rs:124:13
    |
124 |         let mut new_neighbors_a = HashSet::new();
    |             ----^^^^^^^^^^^^^^^
    |             |
    |             help: remove this `mut`
    |
    = note: `#[warn(unused_mut)]` on by default

warning: variable does not need to be mutable
   --> input/code.rs:125:13
    |
125 |         let mut new_neighbors_b = HashSet::new();
    |             ----^^^^^^^^^^^^^^^
    |             |
    |             help: remove this `mut`

warning: 3 warnings emitted

Code

use std::{
    collections::HashSet,
    io::{stdin, BufRead, BufReader},
};

fn main() {
    let mut stdin = BufReader::new(stdin());
    let mut cur_line = String::new();

    stdin.read_line(&mut cur_line).unwrap();
    let mut nums = cur_line
        .split_whitespace()
        .map(|s| s.parse::<usize>().unwrap());

    let n = nums.next().unwrap();
    let m = nums.next().unwrap();

    let maze = fill_maze(n, m);

    println!("{}", get_dist(maze, n, m));
}

fn get_dist(mut maze: Vec<Vec<u8>>, n: usize, m: usize) -> usize {
    let mut neighbors_a = HashSet::new();

    for y in 1..n - 1 {
        for x in 1..m - 1 {
            if maze[y][x] == b'A' {
                if y - 1 > 0 && maze[y - 1][x] != b'A' {
                    neighbors_a.insert((x, y - 1));
                }
                if y + 1 < n - 1 && maze[y + 1][x] != b'A' {
                    neighbors_a.insert((x, y + 1));
                }
                if x - 1 > 0 && maze[y][x - 1] != b'A' {
                    neighbors_a.insert((x - 1, y));
                }
                if x + 1 < m - 1 && maze[y][x + 1] != b'A' {
                    neighbors_a.insert((x + 1, y));
                }
            }
        }
    }

    for c in 1.. {
        let mut new_neighbors = HashSet::new();

        for &(x, y) in &neighbors_a {
            if maze[y][x] == b'B' {
                return c;
            }

            maze[y][x] = b'A';

            if y - 1 > 0 && maze[y - 1][x] != b'A' {
                new_neighbors.insert((x, y - 1));
            }
            if y + 1 < n - 1 && maze[y + 1][x] != b'A' {
                new_neighbors.insert((x, y + 1));
            }
            if x - 1 > 0 && maze[y][x - 1] != b'A' {
                new_neighbors.insert((x - 1, y));
            }
            if x + 1 < m - 1 && maze[y][x + 1] != b'A' {
                new_neighbors.insert((x + 1, y));
            }
        }

        neighbors_a = new_neighbors;
    }

    0
}

fn fill_maze(n: usize, m: usize) -> Vec<Vec<u8>> {
    let mut stdin = BufReader::new(stdin());

    let mut maze = Vec::with_capacity(n);

    for _ in 0..n {
        let mut cur_line = String::new();
        stdin.read_line(&mut cur_line).unwrap();

        maze.push(cur_line.into_bytes());
    }

    let mut neighbors_a = HashSet::new();
    let mut neighbors_b = HashSet::new();

    for y in 1..n - 1 {
        for x in 1..m - 1 {
            if maze[y][x] == b'A' {
                if maze[y - 1][x] == b'.' {
                    neighbors_a.insert((x, y - 1));
                }
                if maze[y + 1][x] == b'.' {
                    neighbors_a.insert((x, y + 1));
                }
                if maze[y][x - 1] == b'.' {
                    neighbors_a.insert((x - 1, y));
                }
                if maze[y][x + 1] == b'.' {
                    neighbors_a.insert((x + 1, y));
                }
            }
            if maze[y][x] == b'B' {
                if maze[y - 1][x] == b'.' {
                    neighbors_b.insert((x, y - 1));
                }
                if maze[y + 1][x] == b'.' {
                    neighbors_b.insert((x, y + 1));
                }
                if maze[y][x - 1] == b'.' {
                    neighbors_b.insert((x - 1, y));
                }
                if maze[y][x + 1] == b'.' {
                    neighbors_b.insert((x + 1, y));
                }
            }
        }
    }

    loop {
        let mut new_neighbors_a = HashSet::new();
        let mut new_neighbors_b = HashSet::new();

        for &(x, y) in &neighbors_a {
            maze[y][x] = b'A';

            if y > 0 && maze[y - 1][x] == b'.' && !neighbors_a.contains(&(x, y - 1)) {
                // new_neighbors_a.insert((x, y - 1));
            }
            if y < n - 1 && maze[y + 1][x] == b'.' && !neighbors_a.contains(&(x, y + 1)) {
                // new_neighbors_a.insert((x, y + 1));
            }
            if x > 0 && maze[y][x - 1] == b'.' && !neighbors_a.contains(&(x - 1, y)) {
                // new_neighbors_a.insert((x - 1, y));
            }
            if x < m - 1 && maze[y][x + 1] == b'.' && !neighbors_a.contains(&(x + 1, y)) {
                // new_neighbors_a.insert((x + 1, y));
            }
        }

        // for &(x, y) in &neighbors_b {
        //     maze[y][x] = b'B';

        //     if maze[y - 1][x] == b'.' && !neighbors_b.contains(&(x, y - 1)) {
        //         new_neighbors_b.insert((x, y - 1));
        //     }
        //     if maze[y + 1][x] == b'.' && !neighbors_b.contains(&(x, y + 1)) {
        //         new_neighbors_b.insert((x, y + 1));
        //     }
        //     if maze[y][x - 1] == b'.' && !neighbors_b.contains(&(x - 1, y)) {
        //         new_neighbors_b.insert((x - 1, y));
        //     }
        //     if maze[y][x + 1] == b'.' && !neighbors_b.contains(&(x + 1, y)) {
        //         new_neighbors_b.insert((x + 1, y));
        //     }
        // }

        if new_neighbors_a.is_empty() && new_neighbors_b.is_empty() {
            break maze;
        }

        neighbors_a = new_neighbors_a;
        neighbors_b = new_neighbors_b;
    }
}

Test details

Test 1

Group: 1, 2

Verdict:

input
20 20
####################
#A.................#
#..................#
#..................#
...

correct output
1

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 2

Group: 1, 2

Verdict:

input
20 20
####################
#A.................#
#..................#
#..................#
...

correct output
2

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 3

Group: 1, 2

Verdict:

input
20 20
####################
#A.................#
#..................#
#..................#
...

correct output
9

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 4

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
1

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 5

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
2

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 6

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
335

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 7

Group: 1, 2

Verdict:

input
20 20
####################
#####.##############
###.....############
##.......###########
...

correct output
10

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 8

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
436

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 9

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
2

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 10

Group: 1, 2

Verdict:

input
20 20
####################
#B................##
#################.##
#################.##
...

correct output
2

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 11

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
2

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 12

Group: 1, 2

Verdict:

input
20 20
####################
##########A#########
##########.#########
##########.#########
...

correct output
2

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 13

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
2

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 14

Group: 1, 2

Verdict:

input
20 20
####################
##########A#########
##########.#########
##########.#########
...

correct output
12

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 15

Group: 2

Verdict:

input
1000 1000
##############################...

correct output
502

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 16

Group: 2

Verdict:

input
3 1000
##############################...

correct output
1

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...

Test 17

Group: 2

Verdict:

input
1000 3
###
#A#
#.#
#.#
...

correct output
1

user output
(empty)

Error:
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 1', input/co...