結果
| 問題 |
No.3 ビットすごろく
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-08-24 15:18:35 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 1,286 bytes |
| コンパイル時間 | 15,075 ms |
| コンパイル使用メモリ | 377,948 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-01 08:03:28 |
| 合計ジャッジ時間 | 13,824 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
use std::io;
use std::io::prelude::*;
use std::io::BufReader;
use std::collections::vec_deque::VecDeque;
fn run(args: &Vec<String>) -> Vec<String> {
let n: u32 = args[0].parse().unwrap();
let mut queue: VecDeque<(u32, u32)> = VecDeque::new();
let mut visited = vec![false; (n + 1) as usize];
queue.push_back((1, 1));
while !queue.is_empty() {
let (k, c) = queue.pop_front().unwrap();
if k == n {
return vec!(c.to_string());
}
let b = bits(k);
let b1 = k - b;
if b1 >= 1 && !visited[b1 as usize] {
queue.push_back((b1, c + 1));
visited[b1 as usize] = true;
}
let b2 = k + b;
if b2 <= n && !visited[b2 as usize] {
queue.push_back((b2, c + 1));
visited[b2 as usize] = true;
}
}
vec!["-1".to_string()]
}
fn bits(n: u32) -> u32 {
let mut n = n;
let mut c = 0;
while n > 0 {
if n & 1 == 1 {
c += 1;
}
n = n >> 1;
}
c
}
fn main() {
let args = lines(BufReader::new(io::stdin()));
for line in run(&args) {
println!("{}", line);
}
}
fn lines<R: Read>(reader: BufReader<R>) -> Vec<String> {
reader.lines().map(|l| l.unwrap()).collect()
}