39 lines
1.1 KiB
Rust
39 lines
1.1 KiB
Rust
macro_rules! parse_line {
|
|
($($t: ty),+) => ({
|
|
let mut line = String::new();
|
|
std::io::stdin().read_line(&mut line).unwrap();
|
|
let mut iter = line.split_whitespace();
|
|
($(iter.next().unwrap().parse::<$t>().unwrap()),+)
|
|
})
|
|
}
|
|
|
|
fn backtrack(vec : &mut Vec<u32>, up_limit: u32, goal_len: u32) -> String{
|
|
let len = vec.len();
|
|
let last = {if len == 0 {0} else{vec[len - 1]}};
|
|
|
|
if goal_len - (len as u32) > up_limit - last{
|
|
return "".to_string();
|
|
}
|
|
else if goal_len == len as u32{
|
|
let mut string : String = vec.iter().map(|x| format_args!("{} ", x).to_string()).collect();
|
|
string.push_str(&"\n".to_string());
|
|
return string;
|
|
}
|
|
|
|
let mut string = String::new();
|
|
for i in last+1..=up_limit{
|
|
vec.push(i);
|
|
let string2 = backtrack(vec, up_limit, goal_len);
|
|
string.push_str(&string2);
|
|
vec.pop().unwrap();
|
|
}
|
|
return string;
|
|
}
|
|
|
|
fn main(){
|
|
let (up_limit, goal_len) = parse_line!(u32, u32);
|
|
let string = &backtrack(&mut Vec::new(), up_limit, goal_len);
|
|
let len = string.len();
|
|
println!("{}", string[..len-1].to_string());
|
|
}
|