|
|
@ -265,25 +265,26 @@ static bool match_obj_(struct match_state *st, size_t skips, size_t score, size_
|
|
|
|
++replaced;
|
|
|
|
++replaced;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool is_best = false;
|
|
|
|
bool has_best = false;
|
|
|
|
for (st->res[i] = 0; st->res[i] < st->num_objs; ++st->res[i]) {
|
|
|
|
for (size_t candidate = 0; candidate < st->num_objs; ++candidate) {
|
|
|
|
// We tried this earlier
|
|
|
|
// We tried this earlier
|
|
|
|
if (st->res[i] == st->orig[i]) {
|
|
|
|
if (candidate == st->orig[i]) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Not compatible
|
|
|
|
// Not compatible
|
|
|
|
if (!(st->objs[st->res[i]] & (1 << i))) {
|
|
|
|
if (!(st->objs[candidate] & (1 << i))) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Already taken
|
|
|
|
// Already taken
|
|
|
|
if (is_taken(i, st->res, st->res[i])) {
|
|
|
|
if (is_taken(i, st->res, candidate)) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st->res[i] = candidate;
|
|
|
|
if (match_obj_(st, skips, score + 1, replaced, i + 1)) {
|
|
|
|
if (match_obj_(st, skips, score + 1, replaced, i + 1)) {
|
|
|
|
is_best = true;
|
|
|
|
has_best = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (st->exit_early) {
|
|
|
|
if (st->exit_early) {
|
|
|
@ -291,7 +292,7 @@ static bool match_obj_(struct match_state *st, size_t skips, size_t score, size_
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (is_best) {
|
|
|
|
if (has_best) {
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|