結果
| 問題 |
No.401 数字の渦巻き
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-05-29 09:47:41 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,061 bytes |
| コンパイル時間 | 11,738 ms |
| コンパイル使用メモリ | 383,880 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-14 10:17:52 |
| 合計ジャッジ時間 | 13,095 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 30 |
ソースコード
fn read<T: std::str::FromStr>() -> T {
let mut s = String::new();
std::io::stdin().read_line(&mut s).ok();
s.trim().parse().ok().unwrap()
}
fn main() {
let n: usize = read();
no401(n);
}
fn no401(n:usize) {
let mut uzu: Vec<Vec<usize>> = vec![vec![1; n]; n];
let move_right = |x:usize,max:usize| -> Option<usize> {
if x < max {
Some(x+1)
} else {
None
}
};
let move_left = |x:usize,min:usize| -> Option<usize> {
if x > min {
Some(x-1)
} else {
None
}
};
let move_bottom = |x:usize,max:usize| -> Option<usize> {
if x < max {
Some(x+1)
} else {
None
}
};
let move_top = |x:usize,min:usize| -> Option<usize> {
if x > min {
Some(x-1)
} else {
None
}
};
fn loop_max_count(m:usize) -> usize {
if m == 0 {
0
} else if m == 1 {
1
} else if m == 2 {
1
} else {
let m2 = (m*m-(m*2 + (m-2)*2)) as f64;
1 + loop_max_count(m2.sqrt().ceil() as usize)
}
}
let mut x = 1;
let mut y = 1;
let mut left_limit = 1;
let mut right_limit = n;
let mut top_limit = 2;
let mut bottom_limit = n;
let mut counter = 1;
let mut loop_limit = loop_max_count(n);
loop {
while let Some(new_x) = move_right(x,right_limit) {
x = new_x;
counter += 1;
uzu[y-1][x-1] = counter;
}
right_limit -= 1;
while let Some(new_y) = move_bottom(y,bottom_limit) {
y = new_y;
counter += 1;
uzu[y-1][x-1] = counter;
}
bottom_limit -= 1;
while let Some(new_x) = move_left(x,left_limit) {
x = new_x;
counter += 1;
uzu[y-1][x-1] = counter;
}
left_limit += 1;
while let Some(new_y) = move_top(y,top_limit) {
y = new_y;
counter += 1;
uzu[y-1][x-1] = counter;
}
top_limit += 1;
loop_limit -= 1;
if loop_limit <= 0 {
break;
}
}
for i in 0..n {
println!(
"{}",
uzu[i].iter().map(|x| format!("{:03}",x)).collect::<Vec<String>>().join(" ")
);
}
}