結果
| 問題 | No.3599 Queen Moving Query |
| コンテスト | |
| ユーザー |
urectanc
|
| 提出日時 | 2026-07-24 23:55:37 |
| 言語 | Rust (1.94.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 118 ms / 5,000 ms |
| + 942µs | |
| コード長 | 1,915 bytes |
| 記録 | |
| コンパイル時間 | 13,418 ms |
| コンパイル使用メモリ | 192,552 KB |
| 実行使用メモリ | 50,432 KB |
| 最終ジャッジ日時 | 2026-07-24 23:56:00 |
| 合計ジャッジ時間 | 13,182 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 |
ソースコード
use std::collections::VecDeque;
use proconio::{
fastout, input,
marker::{Chars, Usize1},
};
#[fastout]
fn main() {
input! {
h: usize, w: usize,
sx: Usize1, sy: Usize1,
s: [Chars; h],
q: usize,
queries: [(Usize1, Usize1, usize); q],
}
let delta = [
(-1, -1),
(-1, 0),
(-1, 1),
(0, -1),
(0, 1),
(1, -1),
(1, 0),
(1, 1),
];
let mut dist = vec![vec![[[!0usize; 2]; 8]; w]; h];
let mut que = VecDeque::new();
for dir in 0..8 {
dist[sx][sy][dir][0] = 0;
que.push_back((sx, sy, dir, 0));
}
let mut can_move = false;
while let Some((i, j, dir, parity)) = que.pop_front() {
let now = dist[i][j][dir][parity];
for (ndir, &(di, dj)) in delta.iter().enumerate() {
let ni = i.wrapping_add_signed(di);
let nj = j.wrapping_add_signed(dj);
if ni >= h || nj >= w || s[ni][nj] == '#' {
continue;
}
if now != 0 && dir == ndir {
let nparity = parity;
if dist[ni][nj][ndir][nparity] == !0 {
dist[ni][nj][ndir][nparity] = now;
que.push_front((ni, nj, ndir, nparity));
can_move |= true;
}
}
{
let nparity = parity ^ 1;
if dist[ni][nj][ndir][nparity] == !0 {
dist[ni][nj][ndir][nparity] = now + 1;
que.push_back((ni, nj, ndir, nparity));
can_move |= true;
}
}
}
}
for &(gx, gy, t) in &queries {
let parity = t % 2;
let min = (0..8).map(|dir| dist[gx][gy][dir][parity]).min().unwrap();
let ans = can_move && min <= t;
println!("{}", if ans { "Yes" } else { "No" });
}
}
urectanc