結果
| 問題 |
No.3 ビットすごろく
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-10-15 15:01:48 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,968 bytes |
| コンパイル時間 | 12,903 ms |
| コンパイル使用メモリ | 377,764 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-20 19:45:19 |
| 合計ジャッジ時間 | 14,325 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | RE * 33 |
ソースコード
use std::collections::VecDeque;
fn getline() -> String{
let mut __ret=String::new();
std::io::stdin().read_line(&mut __ret).ok();
return __ret;
}
fn main() {
let n: usize = getline().trim().parse().unwrap();
// すごろくマス
let mut masu: Vec<i32> = Vec::new();
// 現在の位置
let mut current_position: usize = 0;
// キュー
let mut queue: VecDeque<usize> = VecDeque::new();
// 1-Nのすごろくマスの初期化
for _ in 0..n {
masu.push(-1);
}
// 最初の位置を記録する
masu[current_position - 1] = 1;
queue.push_back(1);
print!("{}", 1);
while !queue.is_empty() {
// bitの1が立ってる数を取得
let bit_count_ones: usize = queue.pop_front().unwrap().count_ones() as usize;
if masu[current_position - bit_count_ones] > 0 && masu[current_position - bit_count_ones] == -1 {
// すごろくを前に進もうとする(マス内にいるか、まだとおっていないマスであれば、現在位置を更新する)
masu[current_position - bit_count_ones] = masu[current_position] + 1;
current_position = current_position - bit_count_ones;
queue.push_back(current_position);
print!("{}", current_position);
}
if current_position + bit_count_ones <= n && masu[current_position + bit_count_ones] == -1 {
// すごろくを後に進もうとする(ゴールより前かつまだ通っていないマス)
masu[current_position + bit_count_ones] = masu[current_position] + 1;
current_position = current_position + bit_count_ones;
queue.push_back(current_position);
print!("{}", current_position);
}
}
// 結局最後のマスに到達しているかしていないかなのでそれを出力する(到達していない場合は -1)
println!("{}", masu[n - 1]);
}