exhaustive algorithms