https://atcoder.jp/contests/abc335/tasks/abc335_d
例にあるようにらせん状にたどればよいです。
// Loong and Takahashi #![allow(non_snake_case)] //////////////////// library //////////////////// fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } //////////////////// process //////////////////// type Point = (usize, usize); fn next(pt: Point, N: usize) -> Point { if pt.0 <= pt.1+1 && pt.0 + pt.1 < N-1 { (pt.0, pt.1+1) } else if pt.0 < pt.1 && pt.0 + pt.1 >= N-1 { (pt.0+1, pt.1) } else if pt.0 >= pt.1 && pt.0 + pt.1 > N-1 { (pt.0, pt.1-1) } else { (pt.0-1, pt.1) } } fn print_table(table: &Vec<Vec<String>>) { for v in table.iter() { println!("{}", v.join(" ")) } } fn F(N: usize) { let mut table: Vec<Vec<String>> = vec![vec!["T".to_string(); N]; N]; let mut pt: Point = (0, 0); for n in 1..N*N { table[pt.0][pt.1] = n.to_string(); pt = next(pt, N) } print_table(&table) } fn main() { let N = read(); F(N) }