# ............................................................................
#             8   Q U E E N S   P U Z Z L E
# ............................................................................



def printQ():
    global sols, found
    for row in range(0, NQ):
        for col in range( 0, NQ ):
            if col == queenCol[row]: print( " Q", end = '')
            else:                    print( " .", end = '')
        print()
    sols += 1
    print( "--" * NQ, sols, )
    found = True

def positionOK(r, c):                          # r: row, c: column
    for i in range(0, r):                      #same column or
        if (queenCol[i] == c  or \
            abs(r - i) == abs(queenCol[i]-c)): # same diagonal
            return False
    return True


def putQueen(row, col):
    # if found: return
    global calls, sols
    calls += 1
    queenCol[row] = col;                # put a queen there
    if row == NQ-1 :                    # if solved
        #print(queenCol)              # output solution
        #printQ()                     # output solution
        sols += 1
    else:
        for c in range(0, NQ):          # test all columns
            if (positionOK(row+1, c)):  # if free
                putQueen(row+1, c)      # next row recursion

# ____________________________________________________________________________
# ............................................................................
#                              M A I N
# ____________________________________________________________________________

NQ = 11 # number of queens
queenCol = [0 for x in range(NQ)]
sols = 0
calls = 0
found = False

for col in range(0, NQ):
    putQueen(0, col)
print( "recursive calls:", calls)
print( "no of solutions:", sols)


