python实现八皇后问题(二位列表)

八皇后问题:

在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))

 

你可能感兴趣的:(python,搜索)