八皇后问题:
在8*8的国际象棋盘上,放置8个皇后,使任何一个皇后都不能吃掉另一个。国际象棋规则中,皇后可以吃到任何一个与他在同一行、同一列或者同一斜线上的敌方棋子,所以八皇后问题的所有解满足:
8个皇后都不在同一行、同一列,或者同一斜线上。
要求:输出所有的解。提示,用递归
这是简单的dfs搜索,python如下
def print1():
global t,arr
print('No.',t)
for i in range(1,9):
for j in range(1,9):
print(arr[i][j],end=' ')
print()
t+=1
def judge(num):
for i in range(1,num):
if (hang[num]==hang[i]) or (abs(hang[i]-hang[num])==num-i):
return False
return True
def dfs(num):
global hang,arr,t
if num==9:
print1()
else:
for i in range(1,9):
hang[num]=i
if judge(num):
arr[num][i]=1
dfs(num+1)
arr[num][i]=0
global t,arr,hang
t=1
hang=[0]*11
arr=[[0 for col in range(10)]for row in range(10)]
dfs(1)
def panduan(n):
'''
判断当前点是否满足行列斜线上没有其他棋子的情况
'''
global mapp,hang
for i in range(0,n):
if (hang[i] == hang[n]) or (abs(hang[i] - hang[n]) == (n - i)):
return 0
return 1
def dfs(n):
'''
矩阵深度遍历所有情况,n为当前的行数
先从第一行找,第二行,第三行,以此类推
'''
global sum1,mapp,hang
if n == 8:#当遍历到n等于8时(第九行),遍历结束
sum1+=1
print('No .',sum1)
for i in mapp:
for j in i:
print(j,end=' ')
print()
return
for i in range(8):#遍历回溯
hang[n]=i #另第n行的第i个位置为棋
if panduan(n):#调用判断函数,判断第n行第i个元素可不可以是棋子
mapp[n][i]='棋'
dfs(n+1)
mapp[n][i]='0'
if __name__ == '__main__':#主函数
mapp = [['0' for row in range(8)]for col in range(8)] # 棋盘
hang= [0]*8 #判断行列斜线冲突问题
sum1=0 #判断总次数
dfs(0)
print('共{}种方案'.format(sum1))