八皇后问题
- 背景
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
- 最简洁的八皇后代码
#八皇后问题,回溯+递归
def queen(A,cur = 0): #定义cur为行数,0开始
#判断当行数为列表长素时,则结束输出
if cur == len(A):
print(A)
return 0
#进行列循环,col为列数
for col in range (len(A)):
#A[cur] 为cur 该行的列数
A[cur] , flag = col ,True
for row in range (cur):
#这个核心判断 A[row] == col 为判断之前列上已有皇后,不能再放
#abs(col - A[row]) == cur - row 用于判断之前位置皇后与现在皇后是否处于同一左右对角线上,处于对角线上的为一个等腰三角形,故行列之差相等,
#又左上对角线为正,右下对角线为负,行列之差一定为正,故用绝对值使之相等
if A[row] == col or abs(col - A[row]) == cur - row:
flag = False
break
if flag:
#递归,进入下一行判断
queen(A,cur+1)
queen([None]*8)
- 结果共92种
`[0, 4, 7, 5, 2, 6, 1, 3]
[0, 5, 7, 2, 6, 3, 1, 4]
[0, 6, 3, 5, 7, 1, 4, 2]
[0, 6, 4, 7, 1, 3, 5, 2]
[1, 3, 5, 7, 2, 0, 6, 4]………………….
[7, 2, 0, 5, 1, 4, 6, 3]
[7, 3, 0, 2, 5, 1, 6, 4]`
- 这个可以用于4*4,5*5,6*6,等等,听说这也是很多公司笔试入门级题目,对于我来说也是写下来与大家共勉,这个代码我感觉还没有完全吃透,以后又新的体会在回过来改正。另外写代码还是要想同想懂之后再写,多想多写,我一直相信越努力越幸运,每个人都是幸运儿,fighting!