# python八皇后问题的两种解法源代码

### python八皇后问题的两种解法源代码

```import time

def init(n):
n = int(n)
row = [0] * (n+1)
box = []
for i in range(n+1):
box.append(list(row))            # 每一行的索引为0的值缺省为1，记录此行皇后索引号的

return box

def is_safe(B,i,j):
n = len(B)-1
direction = [(-1,-1),(-1,0),(-1,1)]

for d in direction:
dx,dy = d
r = i                # 行
c = j                # 列
while True:
r = r + dx
c = c + dy
if r>=1 and r<=n and c>=1 and c<=n:
if B[r][c]==1 :
return False
else:
break
return True

def printBoard(B):

n = len(B)-1
s = [B[i][0] for i in range(1,n+1)]
print(tuple(s))

def removeQueen(B,i,j):
"""移除i行的皇后"""

for x in range(1,len(B)):
B[i][x] = 0

def placeQueen(B,i,j):
"""放皇后，首先移除i行的皇后"""
removeQueen(B,i,j-1)

B[i][j] = 1
B[i][0] = j

def findSolutions(B,i,mode=None):

global acc_sum
n = len(B)-1
if i > n:
if mode=='-v':
printBoard(B)
acc_sum += 1
return 1
else:
for j in range(1,len(B)):
if is_safe(B,i,j):
placeQueen(B,i,j)
findSolutions(B,i+1,mode)

return acc_sum

def main():
import sys
p = sys.argv
p = ['Queen.py','-v','5']
if len(p)==1:
print("Usage: python3 Queens.py [-v] number")
elif len(p)==2:
if p[1].isnumeric():
a = init(p[1])
findSolutions(a,1)
print(f"{p[1]}-Queens.py has {len(box)} solutions")
else:
print("Usage: python3 Queens.py [-v] number")
else:
a = init(p[2])

findSolutions(a,1,p[1])

print(f"{p[2]}-Queens.py has {acc_sum} solutions")

if __name__ == '__main__':
acc_sum = 0
main()

```

```import sys

def no_conflict(board,row,col):
"""检测row行，col列上的皇后是否和其它的皇后有冲突"""
i = 0
while i < row:
if abs(col-board[i]) in (0,abs(row-i)):
return False
i += 1
return True

def EightQueen(board,row):
global box
blen = len(board)
if row == blen:               # 索引为8了，则输出一个方案
box.append(tuple(board))
return True
col = 0
while col < blen:
if no_conflict(board,row,col):  # 如果没有冲突，则摆一颗皇后
board[row] = col
EightQueen(board,row+1)     # 摆下一行
col += 1                        # 同一行，下一列

def main():
global box
p = sys.argv
p = ['Queen.py','-v','7']
if len(p)==1:
print("Usage: python3 Queens.py [-v] number")
elif len(p)==2:
if p[1].isnumeric():
a = [None]*int(p[1])
EightQueen(a,0)
print(f"{p[1]}-Queens.py has {len(box)} solutions")
else:
print("Usage: python3 Queens.py [-v] number")
else:
a = [None]*int(p[2])
EightQueen(a,0)
for b in box:
print(b)
print(f"{p[2]}-Queens.py has {len(box)} solutions")

if __name__== '__main__':

box = []
main()

```