結果

問題 No.3504 Insert Maze
コンテスト
ユーザー ガルム
提出日時 2026-04-18 14:08:15
言語 Rust
(1.94.0 + proconio + num + itertools)
コンパイル:
/usr/bin/rustc_custom
実行:
./target/release/main
結果
AC  
実行時間 501 ms / 2,000 ms
コード長 2,231 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,811 ms
コンパイル使用メモリ 189,876 KB
実行使用メモリ 141,952 KB
最終ジャッジ日時 2026-04-18 14:08:50
合計ジャッジ時間 28,764 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 85
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

use std::io::{self, Read};

fn try_push(
    next: usize,
    dist_next: i32,
    blocked: &[u8],
    dist: &mut [i32],
    queue: &mut Vec<u32>,
) {
    if blocked[next] == 0 && dist[next] == -1 {
        dist[next] = dist_next;
        queue.push(next as u32);
    }
}

fn main() {
    let mut input = String::new();
    io::stdin().read_to_string(&mut input).unwrap();
    let mut it = input.split_whitespace();

    let h: usize = it.next().unwrap().parse().unwrap();
    let w: usize = it.next().unwrap().parse().unwrap();

    let hh = 2 * h - 1;
    let ww = 2 * w - 1;
    let total = hh * ww;
    let mut blocked = vec![0_u8; total];

    for i in 0..h {
        let row = it.next().unwrap().as_bytes().to_vec();
        for j in 0..w {
            if row[j] == b'#' {
                blocked[(2 * i) * ww + 2 * j] = 1;
            }
        }
    }

    let goal = total - 1;
    let mut dist = vec![-1_i32; total];
    let mut queue = Vec::with_capacity(total.min(1_000_000));

    dist[0] = 0;
    queue.push(0);

    let mut head = 0_usize;
    while head < queue.len() {
        let v = queue[head] as usize;
        head += 1;

        if v == goal {
            break;
        }

        let x = v / ww;
        let y = v - x * ww;
        let nd = dist[v] + 1;

        if x > 0 {
            try_push(v - ww, nd, &blocked, &mut dist, &mut queue);
        }
        if x + 1 < hh {
            try_push(v + ww, nd, &blocked, &mut dist, &mut queue);
        }
        if y > 0 {
            try_push(v - 1, nd, &blocked, &mut dist, &mut queue);
        }
        if y + 1 < ww {
            try_push(v + 1, nd, &blocked, &mut dist, &mut queue);
        }

        if x % 2 == 0 {
            if x >= 2 {
                try_push(v - 2 * ww, nd, &blocked, &mut dist, &mut queue);
            }
            if x + 2 < hh {
                try_push(v + 2 * ww, nd, &blocked, &mut dist, &mut queue);
            }
        }
        if y % 2 == 0 {
            if y >= 2 {
                try_push(v - 2, nd, &blocked, &mut dist, &mut queue);
            }
            if y + 2 < ww {
                try_push(v + 2, nd, &blocked, &mut dist, &mut queue);
            }
        }
    }

    println!("{}", dist[goal]);
}
0