递归写法:
# -*- coding:utf-8 -*-
import sys
import copy
global cnt
cnt = 0
def not_danger(i,j,chess):
for ii in range(i):
if chess[ii][j]==1:
return 0
ii,jj = i,j
while (ii-1>=0 and jj-1>=0):
ii-=1
jj-=1
if chess[ii][jj]==1:
return 0
ii,jj = i,j
while (ii-1>=0 and jj+1<8):
ii-=1
jj+=1
if chess[ii][jj]==1:
return 0
return 1
def queen(row,n,chess):
new_chess = copy.deepcopy(chess)
# print('queen/new_chess:',new_chess)
if row==8:
global cnt #注意!此处cnt全局变量的写法
cnt+=1
print('第%d种解:'%cnt)
for ii in range(8):
print(new_chess[ii])
else:
for i in range(n):
# print('i,j,not_danger:',row,i,not_danger(row,i,new_chess))
if not_danger(row,i,new_chess):
new_chess[row] = [0 for jj in range(n)]#注意!嵌套回溯找接下来可能的列数要把之前的标记位清空
new_chess[row][i] = 1
queen(row+1,n,new_chess)#注意!找到之后不能break,继续循环列数下去找其他可能的列值
a = [[0 for i in range(8)] for j in range(8)]
queen(0,8,a)
1、全局变量
2、新建chess2变量存储每种可能的新棋盘
3、每次要把上一次找的列结果抹去,再找此行中的其他列结果
4、递归调用下一行后不能break退出,让程序递归调用查找此行中的其他可能的列