Beispiel #1
0
def solveBoard(board):
    global numUnique, printResult, checkUnique, checkUnique

    def assumeBoard(printBoard):
        for v in checkAssumps:
            cnf.assume(-v)
        row = 0
        col = 0
        for b in board:
            if printBoard:
                sys.stdout.write(b)
            if b == ".":
                pass
            else:
                i = -1
                if N < 10:
                    i = int(b) - 1
                else:
                    i = ord(b) - ord("A")
                # print '(%d,%d) = i = %d' % (row,col,i)
                cnf.assume(p[i][row][col])
            col += 1
            if col == N:
                col = 0
                row += 1
                if row == N:
                    break
        if printBoard:
            sys.stdout.write("\n")

    assumeBoard(printResult)
    result = cnf.solve()
    assert result == cnf.RESULT_SAT
    if printResult:
        showBoard(board)

    if checkUnique:
        v = cnf.newVar("uniq")
        c = [-v]
        for j in range(0, N):
            for k in range(0, N):
                for i in range(0, N):
                    if cnf.assignment(p[i][j][k]):
                        c.append(-p[i][j][k])
        cnf.addClause("uniq", c)
        assumeBoard(False)
        cnf.assume(v)
        checkAssumps.append(v)
        result = cnf.solve()
        if result == cnf.RESULT_SAT:
            print "non-unique board"
            showBoard(board)
            return False
        elif result == cnf.RESULT_UNSAT:
            numUnique += 1
    return True
Beispiel #2
0
def showBoard(board):
    for row in range(0, N):
        if row != 0:
            print ""
            if (row % (N / Sq)) == 0:
                print ("-" * 11)
        for col in range(0, N):
            if col != 0 and (col % (N / Sq)) == 0:
                print "|",
            for i in range(0, N):
                if cnf.assignment(p[i][row][col]):
                    sys.stdout.write("%d" % (i + 1))
    print ""