CSES - Datatähti 2022 loppu - Results
Submission details
Task:Sokkelo
Sender:xnor
Submission time:2022-01-22 14:56:10 +0200
Language:Rust
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED28
#2ACCEPTED72
Test results
testverdicttimegroup
#1ACCEPTED0.01 s1, 2details
#2ACCEPTED0.01 s1, 2details
#3ACCEPTED0.01 s1, 2details
#4ACCEPTED0.23 s2details
#5ACCEPTED0.24 s2details
#6ACCEPTED0.22 s2details
#7ACCEPTED0.01 s1, 2details
#8ACCEPTED0.17 s2details
#9ACCEPTED0.17 s2details
#10ACCEPTED0.01 s1, 2details
#11ACCEPTED0.28 s2details
#12ACCEPTED0.01 s1, 2details
#13ACCEPTED0.01 s2details
#14ACCEPTED0.01 s1, 2details
#15ACCEPTED0.12 s2details
#16ACCEPTED0.01 s2details
#17ACCEPTED0.01 s2details

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, &mut stdin);

    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, stdin: &mut impl BufRead) -> Vec<Vec<u8>> {
    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());

        if maze.last().unwrap().len() < m {
            return Vec::new();
        }
    }

    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: ACCEPTED

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

correct output
1

user output
1

Test 2

Group: 1, 2

Verdict: ACCEPTED

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

correct output
2

user output
2

Test 3

Group: 1, 2

Verdict: ACCEPTED

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

correct output
9

user output
9

Test 4

Group: 2

Verdict: ACCEPTED

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

correct output
1

user output
1

Test 5

Group: 2

Verdict: ACCEPTED

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

correct output
2

user output
2

Test 6

Group: 2

Verdict: ACCEPTED

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

correct output
335

user output
335

Test 7

Group: 1, 2

Verdict: ACCEPTED

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

correct output
10

user output
10

Test 8

Group: 2

Verdict: ACCEPTED

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

correct output
436

user output
436

Test 9

Group: 2

Verdict: ACCEPTED

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

correct output
2

user output
2

Test 10

Group: 1, 2

Verdict: ACCEPTED

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

correct output
2

user output
2

Test 11

Group: 2

Verdict: ACCEPTED

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

correct output
2

user output
2

Test 12

Group: 1, 2

Verdict: ACCEPTED

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

correct output
2

user output
2

Test 13

Group: 2

Verdict: ACCEPTED

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

correct output
2

user output
2

Test 14

Group: 1, 2

Verdict: ACCEPTED

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

correct output
12

user output
12

Test 15

Group: 2

Verdict: ACCEPTED

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

correct output
502

user output
502

Test 16

Group: 2

Verdict: ACCEPTED

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

correct output
1

user output
1

Test 17

Group: 2

Verdict: ACCEPTED

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

correct output
1

user output
1