Benjamin's answer agrees with a brute (and by brute I mean brute) force calculation using Python. The following code was already used in parts for [this question][1] and recycled (see also there for code hints). For the variant with castling rights, just delete `])#` to check your result. (Edited code tip: The inner `if` checks whether all neighbors of knights are border or bishop or another knight...or rook if castling counts.) def nextperm(permo): n = len(permo) y = n - 1 while permo[y - 1] > permo[y]: y -= 1 yy = n - 1 while permo[y - 1] > permo[yy]: yy -= 1 permn = permo[0:y - 1] + [permo[yy]] + sorted(permo[y - 1:yy] + permo[yy + 1:n]) return permn def perminv(perm): num_sqsize = len(perm) perm_inv = [0 for _ in range(num_sqsize)] for y in range(num_sqsize): x = perm[y] perm_inv[x] = y return perm_inv ch = ['K','Q','R','R','B','B','N','N'] #01234567 = kqrrbbnn perm = [_ for _ in range(8)] ct = 0 ca = [0]*7 for i in range(40320): ki = perm[0] qu = perm[1] lr = perm[2] rr = perm[3] lb = perm[4] rb = perm[5] ln = perm[6] rn = perm[7] if lr < ki < rr and ln < rn and lb < rb and (lb+rb)%2 == 1: out = '' permi = perminv(perm) for j in range(8): out += ch[permi[j]] set1=set([ln+1,ln-1,rn+1,rn-1]) set2=set([-1,8,lb,rb,ln,rn])#,lr,rr]) if set1.issubset(set2): ct += 1 print(ct,out) perm = nextperm(perm) [1]: https://puzzling.stackexchange.com/questions/122390/chess-960-and-castling-2