You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.2 KiB
66 lines
1.2 KiB
struct Step { |
|
i: i8, |
|
j: i8 |
|
} |
|
|
|
struct Steps { |
|
l: usize, |
|
i: usize, |
|
j: usize, |
|
k: usize, |
|
s: usize, |
|
} |
|
|
|
impl Steps { |
|
fn new(n: usize) -> Steps { |
|
return Steps { |
|
i: n / 2, |
|
j: n / 2, |
|
l: 1, |
|
k: 1, |
|
s: 0 |
|
}; |
|
} |
|
|
|
fn ads(&mut self, s: &Step) { |
|
if s.i < 0 { self.i -= 1; } |
|
if s.i > 0 { self.i += 1; } |
|
if s.j < 0 { self.j -= 1; } |
|
if s.j > 0 { self.j += 1; } |
|
} |
|
|
|
fn next(&mut self, n: u32) { |
|
//self.corner = false; |
|
let mut sts = Vec::new(); |
|
sts.push(Step { i: 0, j: 1 }); |
|
sts.push(Step { i: -1, j: 0 }); |
|
sts.push(Step { i: 0, j: -1 }); |
|
sts.push(Step { i: 1, j: 0 }); |
|
|
|
if self.k > self.l { |
|
//self.corner = true; |
|
self.k = 1; |
|
self.s += 1; |
|
if self.s == sts.len() { |
|
self.s = 0; |
|
self.l += 1; |
|
} |
|
if self.s == 2 { |
|
self.l += 1; |
|
} |
|
println!("{}", n); |
|
} |
|
|
|
let st = &sts[self.s]; |
|
self.k += 1; |
|
self.ads(st); |
|
} |
|
|
|
} |
|
|
|
fn main() { |
|
let mut st = Steps::new(7); |
|
for n in 1..20 { |
|
st.next(n); |
|
} |
|
}
|
|
|