X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=matchsticks-search.git;a=blobdiff_plain;f=main.c;h=3c1b123b2e71155b058bdc34d45f058f6db592f9;hp=6f0df725949c9b26fccb613768f74c283bc9e591;hb=ea5f3526c7c05c153a9c7c49e91c9ac649560fba;hpb=0169095a9c345a65ee9e091df63a0e52d3910d1d diff --git a/main.c b/main.c index 6f0df72..3c1b123 100644 --- a/main.c +++ b/main.c @@ -86,6 +86,9 @@ static double best; static glp_prob *best_prob; static AdjWord *best_adjmatrix; +static int n_over_best; +static int *weight; + static unsigned printcounter; static AdjWord *xalloc_adjmatrix(void) { @@ -96,6 +99,9 @@ static void prep(void) { adjall = ~((~(AdjWord)0) << m); adjmatrix = xalloc_adjmatrix(); glp_term_out(GLP_OFF); + n_over_best = n / best; + weight = (int *)malloc(m*sizeof(int)); + for (int j = 0; j < m; j++) weight[j] = 0; } static AdjWord one_adj_bit(int bitnum) { @@ -300,6 +306,7 @@ static void optimise(int doprint) { HAVE_PRINTED; best = got; + n_over_best = n / best; if (best_prob) glp_delete_prob(best_prob); best_prob = prob; @@ -331,9 +338,20 @@ static void iterate_recurse(int i, AdjWord min) { goto again; if (i == 0 && (adjmatrix[i] & (1+adjmatrix[i]))) goto again; + for (int j = 0; j < m; j++) + if (adjmatrix[i] & (1 << j)) + weight[j]++; + for (int j = 0; j < m; j++) + if (weight[j] >= n_over_best) + goto takeout; iterate_recurse(i+1, adjmatrix[i]); + takeout: + for (int j = 0; j < m; j++) + if (adjmatrix[i] & (1 << j)) + weight[j]--; + again: if (adjmatrix[i] == adjall) return;