N皇后棋盘是一个比较经典的笔试题,力扣和牛客上也有相应题目说明和优秀的解答方法
本文只是针对一篇比较简洁的代码进行精简和测试
参考:https://blog.csdn.net/qq_43235359/article/details/90605468
这位大佬的解决方法写得非常好,递归的代码非常简洁,我只是理解了然后进一步精简了一下代码
def queen(result, board, n, row=0):
if row >= n:
result.append(board[::])
else:
for col in range(n):
for i in range(row):
x, y = i - row, board[i] - col
if y == 0 or x == y or x == -y:
break
else:
board[row] = col
queen(result, board, n, row + 1)
然后测试一下不同的N皇后棋盘解法数目解法效率
设置当程序时间大于等于10秒或者棋盘规模N大于等于50时退出
N = 1
while True:
res = []
t0 = time.time()
queen(res, [0 for _ in range(N)], N)
t = time.time() - t0
print("%d皇后棋盘解空间%d,正解数:%d, 耗时%f秒" % (N, N ** N, len(res), t))
if t >= 10 or N >= 50:
break
else:
N += 1
递归方法具有代码简洁的优势,但是随着数据规模的增大,算法效率还是有所降低
算法的最坏时间复杂度为,n*(1+S1+S2+S3+...+Sn)=5/6n^4+1/2n^3-2/3n^2=O(n^4)<O(n^n)
作者水平有限,算法复杂度若有计算错误的地方还请批评指正
二叉树搜索可能对提高效率有帮助 ,我再研究一下