1. 程式人生 > >回溯法 n皇后 python 解法二

回溯法 n皇后 python 解法二

這兒採用一維陣列,即行數作為index,而列數代表array[index]

輸出所有的解

global N  # 皇后個數
# global x  # 當前解  list型別不需要宣告為全域性變數!
global SUM  # 當前已找到的可行方案數
N = 4
# x = [0 for i in range(N)]
SUM = 0

def print_solution(x):
    for i in range(len(x)):
        print(x[i], end="")
    print()


def is_safe(k):
    for i in range(k):
        if
x[i] == x[k]: return False if (x[i] - x[k]) == (i - k): return False if (x[i] - x[k]) == (k - i): return False return True def backtrack(t): if t >= N: global SUM # 若希望在區域性函式中修改全域性變數,則需要先宣告,否則會把SUM作為區域性變數處理 SUM += 1 print_solution(x) else
: for i in range(N): x[t] = i if is_safe(t): backtrack(t + 1) if __name__ == "__main__": x = [0 for i in range(N)] backtrack(0) print("sum =" + str(SUM))

若只想輸出指定個數的解就退出:

global N  # 皇后個數
# global x  # 當前解  list型別不需要宣告為全域性變數!
global SUM  # 當前已找到的可行方案數
N = 4 # x = [0 for i in range(N)] SUM = 0 def print_solution(x): for i in range(len(x)): print(x[i], end="") print() def is_safe(k): for i in range(k): if x[i] == x[k]: return False if (x[i] - x[k]) == (i - k): return False if (x[i] - x[k]) == (k - i): return False return True def backtrack(t): # 但其實這樣寫不怎麼好,因為破壞了回溯法的結構 # 更好的寫法是,把判斷放到剪紙函式中,這兒即is_safe()中去判斷 global SUM if SUM >= 1: # 達到期望的借個數就退出 return if t >= N: # global SUM # 若希望在區域性函式中修改全域性變數,則需要先宣告,否則會把SUM作為區域性變數處理 SUM += 1 print_solution(x) else: for i in range(N): x[t] = i if is_safe(t): backtrack(t + 1) if __name__ == "__main__": x = [0 for i in range(N)] backtrack(0) print("sum =" + str(SUM))