简体   繁体   中英

Boolean expression for modified Queens problem

I saw the boolean expressions for the N Queens problem from here .

My modified N queens rules are simpler:

For ap*p chessboard I want to place N queens in such a way so that

  1. Queens will be placed adjacently, rows will be filled first.
  2. p*p chessboard size will be adjusted until it can hold N queens

For example, say N = 17, then we need a 5*5 chessboard and the placement will be:

Q_Q_Q_Q_Q
Q_Q_Q_Q_Q
Q_Q_Q_Q_Q
Q_Q_*_*_*
*_*_*_*_*

The question is I am trying to come up with a boolean expression for this problem .

This problem can be solved using the Python packages humanize and omega .

"""Solve variable size square fitting."""
import humanize
from omega.symbolic.fol import Context


def pick_chessboard(q):
    ctx = Context()
    # compute size of chessboard
    #
    # picking a domain for `p`
    # requires partially solving the
    # problem of computing `p`
    ctx.declare(p=(0, q))
    s = f'''
       (p * p >= {q})  # chessboard fits the queens, and
       /\ ((p - 1) * (p - 1) < {q})  # is the smallest such board
       '''
    u = ctx.add_expr(s)
    d, = list(ctx.pick_iter(u))  # assert unique solution
    p = d['p']
    print(f'chessboard size: {p}')
    # compute number of full rows
    ctx.declare(x=(0, p))
    s = f'x = {q} / {p}'  # integer division
    u = ctx.add_expr(s)
    d, = list(ctx.pick_iter(u))
    r = d['x']
    print(f'{r} rows are full')
    # compute number of queens on the last row
    s = f'x = {q} % {p}'  # modulo
    u = ctx.add_expr(s)
    d, = list(ctx.pick_iter(u))
    n = d['x']
    k = r + 1
    kword = humanize.ordinal(k)
    print(f'{n} queens on the {kword} row')


if __name__ == '__main__':
    q = 10  # number of queens
    pick_chessboard(q)

Representing multiplication (and integer division and modulo) with binary decision diagrams has complexity exponential in the number of variables, as proved in: https://doi.org/10.1109/12.73590

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM