summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2019-12-22 17:14:42 +0100
committerDennis Kobert <dennis@kobert.dev>2019-12-22 17:14:42 +0100
commit4e148d3c1377a3162998b95e990ced1debf2296b (patch)
tree8e2f6b8f05c51003535e6a3ccb72a0170b3a5394
parentae4b77317205b7604754e4591e4ca295df7dd2d7 (diff)
Prune solver by ommitting some permutations
-rw-r--r--src/solvers/intuitive.rs8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/solvers/intuitive.rs b/src/solvers/intuitive.rs
index 77f63e5..0899906 100644
--- a/src/solvers/intuitive.rs
+++ b/src/solvers/intuitive.rs
@@ -100,6 +100,7 @@ impl<T: num::PrimInt> NormalSolver<T> {
}
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() {
//println!("checking {:?}", numbers);
if self.check_perm(&numbers) {
@@ -108,9 +109,9 @@ impl<T: num::PrimInt> NormalSolver<T> {
return;
}
let mut new_num = Vec::from(numbers);
- for i in numbers[index as usize] as usize..up {
+ for i in numbers[index as usize] as usize..((index + 1) * chunk) {
for n in (index + 1)..numbers.len() {
- new_num[n] = (n * (self.permutations.len() / self.h as usize)) as u32;
+ new_num[n] = (n * chunk) as u32;
}
self.permute(up, index + 1, &new_num);
new_num[index] += 1;
@@ -124,7 +125,8 @@ impl<T: num::PrimInt> NormalSolver<T> {
let mut sums = vec![self.w; self.w as usize];
for (i, num) in nums.iter().enumerate() {
let mut sum = 0;
- for n in self.permutations[*num as usize][..(self.n - 1) as usize].iter() {
+ for n in self.permutations[*num as usize][..(self.n - 1 - (self.n & 1)) as usize].iter()
+ {
sum += *n as usize;
if sums[sum - 1] != self.w {
return false;