From 99d4421c47eed1a529f4ba321282fe7eb877c011 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 23 Dec 2019 00:16:34 +0100 Subject: Introduce some shortcuts --- src/main.rs | 2 +- src/solvers/intuitive.rs | 78 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6822087..32143d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ mod solvers; mod structs; fn main() { - let mut solver = solvers::intuitive::NormalSolver::::new(6); + let mut solver = solvers::intuitive::NormalSolver::::new(8); solver.solve(); //wall.output(solver.n, solver.h); diff --git a/src/solvers/intuitive.rs b/src/solvers/intuitive.rs index 0899906..f858a42 100644 --- a/src/solvers/intuitive.rs +++ b/src/solvers/intuitive.rs @@ -53,12 +53,16 @@ impl SaveState { } #[allow(dead_code)] - pub fn bridges_gap(&self, gap: u32) -> bool { + pub fn bridges_gap(&self, gap: u32, n: u32) -> bool { + if gap - self.sum > n { + //println!("{}", gap - self.sum); + return false; + } self.get_bit(gap - self.sum) == T::zero() } #[allow(dead_code)] - pub fn bridge_gap(mut self, gap: u32) -> Self { + pub unsafe fn bridge_gap(mut self, gap: u32) -> Self { self.set_bit(gap - self.sum); self.sum = gap; self @@ -73,10 +77,18 @@ impl NormalSolver { let heap = permutohedron::Heap::new(&mut heap); let n_f = permutohedron::factorial(n as usize); let mut permutations = Vec::with_capacity(n_f); - println!("Generating permutations"); + //println!("Generating permutations"); for data in heap { permutations.push(data.clone()); } + /*use permutohedron::LexicalPermutation; + loop { + permutations.push(heap.to_vec()); + if !heap.next_permutation() { + break; + } + }*/ + Self { n, h, @@ -87,10 +99,11 @@ impl NormalSolver { } pub fn solve(&mut self) { - //for (n, i) in self.permutations.iter().enumerate() { - // println!("perm {}: {:?}", n, i); - //} - println!("calculate results"); + for (n, i) in self.permutations.iter().enumerate() { + let tmp: Vec = i.iter().map(|x| *x).collect(); + //println!("perm {}: {:?}", n, tmp); + } + //println!("calculate results"); self.permute( permutohedron::factorial(self.n as usize), 0, @@ -101,10 +114,30 @@ impl NormalSolver { fn permute(&mut self, up: usize, index: usize, numbers: &[u32]) { let chunk = self.permutations.len() / self.h as usize; + if index as usize == numbers.len() - 2 { + let mut new_num = Vec::from(numbers); + if self.n == 6 { + new_num[2] = 675; + } + if self.n == 8 { + //new_num[3] = 38728; + new_num[3] = 36719; + } + + if self.check_perm(&new_num[..(new_num.len() - 1)]) { + for i in new_num { + println!("{}\t{}", numbers[0], i); + } + } + return; + } if index as usize == numbers.len() { //println!("checking {:?}", numbers); if self.check_perm(&numbers) { - println!("success"); + //println!("success"); + for i in numbers { + println!("{},{}", numbers[0], i); + } } return; } @@ -134,13 +167,33 @@ impl NormalSolver { sums[sum - 1] = i as u32; } } + //for i in 0..sums.len() { + // let test = SaveState::::new(); + // if sums[i] == self.w { + // if !test.bridges_gap(i as u32, self.n) { + // //return false; + // } + // unsafe { + // test.bridge_gap(i as u32); + // } + // } + //} unsafe { SOLUTIONS += 1; } //println!("{:?}", sums); - GapHeights::from_heights(sums.iter().map(|x| *x as u32).collect()).output(self.n, self.h); - //.as_stone_wall(self.n) - //.output(); + let vec = sums + .iter() + .map(|x| if *x != self.w { *x as u32 } else { self.h - 1 }) + .collect(); + //println!("{:?}", vec); + let vec = GapHeights::from_heights(vec); //.output(self.n, self.h); + + if !self.check_gaps(&vec) { + return false; + } + println!("success"); + vec.as_stone_wall(self.n).output(); true } @@ -148,6 +201,9 @@ impl NormalSolver { fn check_gaps(&mut self, wall: &GapHeights) -> bool { for (i, r) in wall.iter().enumerate() { let stone = (i + 1) as u32 - self.solve_stack[r as usize].sum; + if stone > self.n { + return false; + } self.solve_stack[r as usize].set_bit(stone); } for state in self.solve_stack.as_ref() as &[SaveState] { -- cgit v1.2.3-54-g00ecf