From 08bd65b2c5c49aacf5e6db014ae6cf44e4b50082 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 23 Dec 2019 01:44:30 +0100 Subject: Fix calculation of last row --- src/solvers/intuitive.rs | 53 ++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 24 deletions(-) (limited to 'src/solvers') diff --git a/src/solvers/intuitive.rs b/src/solvers/intuitive.rs index f858a42..f4afcff 100644 --- a/src/solvers/intuitive.rs +++ b/src/solvers/intuitive.rs @@ -1,5 +1,6 @@ use crate::solver::Solver; use crate::structs::GapHeights; +use std::os::raw::c_ushort; /// Solve for a given N and return the resulting wall pub struct NormalSolver { @@ -62,10 +63,9 @@ impl SaveState { } #[allow(dead_code)] - pub unsafe fn bridge_gap(mut self, gap: u32) -> Self { + pub unsafe fn bridge_gap(&mut self, gap: u32) { self.set_bit(gap - self.sum); self.sum = gap; - self } } @@ -107,24 +107,24 @@ impl NormalSolver { self.permute( permutohedron::factorial(self.n as usize), 0, - ((0..self.h).collect::>()).as_ref(), + ((0..(self.h - 1)).collect::>()).as_ref(), ); unsafe { println!("tries: {}\nsolutions: {}", TRIES, SOLUTIONS) } } 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 { + if index as usize == numbers.len() - 1 { let mut new_num = Vec::from(numbers); if self.n == 6 { - new_num[2] = 675; + new_num[2] = 680; } if self.n == 8 { //new_num[3] = 38728; new_num[3] = 36719; } - if self.check_perm(&new_num[..(new_num.len() - 1)]) { + if self.check_perm(&new_num) { for i in new_num { println!("{}\t{}", numbers[0], i); } @@ -134,7 +134,7 @@ impl NormalSolver { 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); } @@ -152,6 +152,9 @@ impl NormalSolver { } fn check_perm(&mut self, nums: &[u32]) -> bool { + //for i in nums { + // println!("{},{}", nums[0], i); + //} unsafe { TRIES += 1; } @@ -167,19 +170,16 @@ 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; + let mut test = SaveState::::new(); + for i in 0..sums.len() { + if sums[i] == self.w { + if !test.bridges_gap(i as u32, self.n) { + return false; + } + unsafe { + test.bridge_gap(i as u32); + } + } } //println!("{:?}", sums); let vec = sums @@ -189,22 +189,27 @@ impl NormalSolver { //println!("{:?}", vec); let vec = GapHeights::from_heights(vec); //.output(self.n, self.h); - if !self.check_gaps(&vec) { - return false; + //if !self.check_gaps(&vec) { + // return false; + //} + //println!("success"); + unsafe { + SOLUTIONS += 1; } - println!("success"); - vec.as_stone_wall(self.n).output(); + //vec.as_stone_wall(self.n).output(); true } #[allow(dead_code)] fn check_gaps(&mut self, wall: &GapHeights) -> bool { + self.solve_stack = vec![SaveState::new(); self.h as usize]; 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); + self.solve_stack[r as usize].sum = i as u32; } for state in self.solve_stack.as_ref() as &[SaveState] { if state.bitmask != T::from(1 << self.n).unwrap() { -- cgit v1.2.3-54-g00ecf