八皇后问题回溯法解法
回溯法
def queen(A, cur=0): if cur == len(A): # 当列遍历到达第9列,表示一个八皇后序列生成,结束本轮回溯 print(A) # 打印该序列 return 0 for col in range(len(A)): A[cur], flag = col, True# 初始化当前列的皇后在第0行,flag=True for row in range(cur): # 判别当前列初始化后与其他皇后是否冲突,如果冲突结束循环,在下一轮中将当前皇后下移一行 if A[row] == col or abs(col - A[row]) == cur - row: # 判断对角线,横轴差=纵轴差 flag = False break if flag: queen(A, cur + 1) # 如果当前皇后位置与其他皇后不冲突,则搜索下一个皇后的位置 queen([None]*8) #[None, None, None, None, None, None, None, None]
下面的代码与上面的相同,注意cur是当前列,A[cur]=col是当前列皇后所在的行;row是遍历当前皇后之前的所有皇后的列,A[row]是皇后所在的行。下面的代码更容易理解。
def queen(A, cur = 0): if cur == len(A): print(A) return 0 for col in range(len(A)): A[cur] = col flag = True for row in range(cur): if A[cur] == A[row] or abs(cur - row) == abs(A[cur] - A[row]): flag = False break if flag: queen(A, cur + 1) queen([None] * 8)
下一篇:
Java设计模式之策略模式