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
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 ""