#Throw a SAT solver at the 8-Queens problem. #Actually, here we do N queens. #Variables are x(i,j) where i is the row number 0<=iiN+j+1 import pycosat def encode(i,j,N): return i*N+j+1 def decode(k,N): return divmod(k-1,N) #return a clause that says there is a queen on a row: def queen_on_row(row,N): return [encode(row,j,N) for j in range(N)] #return a clause that says there are not two #queens on two given locations def no_attack(row1,row2,col1,col2,N): return [-encode(row1,col1,N),-encode(row2,col2,N)] #return a list of the Type 1 clauses' def type1(N): clauses=[] for j in range(N): clauses.append(queen_on_row(j,N)) return clauses def type2(N): clauses=[] for row in range(N): for j in range(N-1): for k in range(j+1,N): clauses.append(no_attack(row,row,j,k,N)) return clauses def type3(N): clauses=[] for col in range(N): for j in range(N-1): for k in range(j+1,N): clauses.append(no_attack(j,k,col,col,N)) return clauses def type4(N): clauses=[] for row in range(N): for column in range(N): for offset in range(1,N-1): if row+offset0: column=decode(item,N)[1] print('-'*column+'O'+'-'*(N-column-1))