我的解题思路如下:对于n*n的这样一个棋盘,其实N皇后问题可以转化为这样一个问题,给定一个list,[0,1,2,```,n-1],index代表行,list[i]代表第i行的皇后所在的列,比如list[1]=2,代表第1行的皇后在第2列,皇后的方法其实有n!种,也就是这个list的一个全排列,这种全排列自然而然就解决了皇后不再同一行不再同一列这个约束,但是这种方式暂且无法解决,皇后不再对角线的问题。

对于皇后不能对角线的问题,可以这样来解决,建两个set,第一个set解决皇后不能正对角线的问题,第二个set解决皇后不能负对角线的问题。正对角线的皇后有一个特征是所在列号减所在行号都相等,比如对于一种皇后排列[0,1],0-0=1-1=0。对于负对角线的皇后有一个特征是所在行号+所在列号均相等,比如[1,0],0+1=1+0=1。因此可以把前面皇后所在位置的正对角线和负对角线的特征分别存在set1和set2中去,然后后面的皇后注意不能放在set1和set2中标注的位置。

有了上面的前提条件,就可以通过递归解决该问题了,递归函数设置为:def getqueennum(self , l , lab_set_add,lab_set_sub , row_index),l是还未放置的列号集合,lab_set_add存放已经存在的负对角线,lab_set_sub存放已经存在的正对角线, row_index为将要设置皇后的行号。

遍历l中的每个元素,如果该元素在row_index这行不是对角线所在位置,则放置该元素,然后将对角线集合更新下,因为多了这个元素,在递归放置下一行皇后位置getqueennum(self , 去掉该元素的l , lab_set_add,lab_set_sub , row_index+1)。

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param n int整型 the n
# @return int整型
#
import copy

class Solution:
    def Nqueen(self , n: int) -> int:
        # write code here
        self.num = 0
        self.getqueennum(list(range(n)) , set(),set() , 0)
        return self.num

    def getqueennum(self , l , lab_set_add,lab_set_sub , row_index):
        if len(l) == 1:
            tmp_ele = l[0] ; tmp_add = tmp_ele + row_index ; tmp_sub = tmp_ele - row_index
            if tmp_add in lab_set_add or tmp_sub in lab_set_sub:
                return
            else:
                self.num+=1
                return 
        for i in range(len(l)):
            tmp_ele = l[i] ; tmp_add = tmp_ele + row_index ; tmp_sub = tmp_ele - row_index
            if tmp_add in lab_set_add or tmp_sub in lab_set_sub:
                pass
            else:
                if i != len(l)-1:
                    tmp_lab_set_add = copy.deepcopy(lab_set_add)
                    tmp_lab_set_sub = copy.deepcopy(lab_set_sub)
                    tmp_lab_set_add.add(tmp_add) ; tmp_lab_set_sub.add(tmp_sub)
                    self.getqueennum( l[:i]+l[i+1:], tmp_lab_set_add , tmp_lab_set_sub , row_index+1)
                else:
                    tmp_lab_set_add = copy.deepcopy(lab_set_add)
                    tmp_lab_set_sub = copy.deepcopy(lab_set_sub)
                    tmp_lab_set_add.add(tmp_add) ; tmp_lab_set_sub.add(tmp_sub)
                    self.getqueennum( l[:i], tmp_lab_set_add , tmp_lab_set_sub , row_index+1)

n = 8
print(Solution().Nqueen(n))