AtCoder Beginner Contest 335 D

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)
}