Files
CodeTest/baekjoon/별_찍기_-_10/solution_19017654.rs
2024-08-29 16:22:30 +09:00

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