KenKen puzzle addends: REDUX A (corrected) non-recursive algorithm

后端 未结 9 1738
眼角桃花
眼角桃花 2021-01-03 05:24

This question relates to those parts of the KenKen Latin Square puzzles which ask you to find all possible combinations of ncells numbers with values x such that 1 <= x &

9条回答
  •  长情又很酷
    2021-01-03 05:47

    And here is another recursive, generator-based solution, but this time using some simple math to calculate ranges at each step, avoiding needless recursion:

    def latinSquares(max_val, target_sum, n_cells):
      if n_cells == 1:
        assert(max_val >= target_sum >= 1)
        return ((target_sum,),)
      else:
        lower_bound = max(-(-target_sum / n_cells), 1)
        upper_bound = min(max_val, target_sum - n_cells + 1)
        assert(lower_bound <= upper_bound)
        return ((v,) + w for v in xrange(upper_bound, lower_bound - 1, -1)
                         for w in latinSquares(v, target_sum - v, n_cells - 1))
    

    This code will fail with an AssertionError if you supply parameters that are impossible to satisfy; this is a side-effect of my "correctness criterion" that we never do an unnecessary recursion. If you don't want that side-effect, remove the assertions.

    Note the use of -(-x/y) to round up after division. There may be a more pythonic way to write that. Note also I'm using generator expressions instead of yield.

    for m in latinSquares(6,12,4):
      print m
    

提交回复
热议问题