60 lines
1.5 KiB
Rust
60 lines
1.5 KiB
Rust
use std::io::{self, Write, BufWriter};
|
|
|
|
fn main(){
|
|
let mut n = String::new();
|
|
io::stdin().read_line(&mut n)
|
|
.expect("Failed to read line");
|
|
let n = n.trim().parse::<usize>().expect("Not an integer");
|
|
let mut vector : Vec<Vec<char>> = vec![vec!['*'; n]; n];
|
|
|
|
let k = log3(&n);
|
|
fill_star(&mut vector, k, 0, 0);
|
|
print_star(vector);
|
|
}
|
|
|
|
fn log3(n : &usize) -> usize{
|
|
let mut m : usize = 1;
|
|
let mut k : usize = 0;
|
|
|
|
while m < *n{
|
|
m *= 3;
|
|
k += 1
|
|
}
|
|
|
|
return k;
|
|
}
|
|
|
|
fn fill_star(vector : &mut Vec<Vec<char>>, n : usize, a : usize, b : usize){
|
|
// remove star
|
|
let length_box : usize = 3_usize.pow((n - 1) as u32);
|
|
let (istart, jstart) : (usize, usize) = (length_box * (3 * a + 1), length_box * (3 * b + 1));
|
|
for i in istart .. istart + length_box{
|
|
for j in jstart .. jstart + length_box{
|
|
vector[i][j] = ' ';
|
|
}
|
|
}
|
|
|
|
if n == 1{
|
|
return;
|
|
}
|
|
|
|
// go to smaller box
|
|
let list_idx : [(usize, usize); 8] = [(0, 0), (0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1), (2, 2)];
|
|
for (i, j) in &list_idx{
|
|
fill_star(vector, n - 1, 3 * a + i, 3 * b + j);
|
|
}
|
|
}
|
|
|
|
fn print_star(vector : Vec<Vec<char>>){
|
|
let stdout = io::stdout();
|
|
let lock = stdout.lock();
|
|
let mut buff = BufWriter::new(lock);
|
|
|
|
let length = vector.len();
|
|
for i in 0..length{
|
|
let s : String = vector[i].iter().collect();
|
|
buff.write_fmt(format_args!("{}\n", s)).expect("Failed to write");
|
|
}
|
|
}
|
|
|