이 기사에서는 주로 역추적 방법 하위 집합 트리 템플릿을 기반으로 8-Queens 문제를 구현하기 위해 Python을 소개합니다. 8-Queens 문제의 원리를 간략하게 설명하고 Python 역추적 방법 하위 집합 트리 템플릿의 구체적인 구현 기술을 분석하여 문제를 해결합니다. 8-Queens 문제를 예제 형태로 보여줍니다. 친구들이 참고할 수 있습니다.
이 글에서는 역추적 방법 부분 집합 트리 템플릿을 기반으로 8-Queen 문제를 구현하는 Python의 예제를 설명합니다. 참고를 위해 모든 사람과 공유하세요.
문제
8×8 그리드 체스에 8개의 퀸을 배치하여 서로 공격할 수 없도록 합니다. 즉, 두 명의 퀸이 같은 곳에 있을 수 없습니다. 행이나 열 또는 같은 대각선에 방법이 몇 개인지 물어보세요.
Analytics
문제를 단순화하기 위해 8개의 Queen이 서로 다른 행에 있다는 점을 고려하면 각 행에 하나의 Queen을 배치하고 각 행의 Queen을 열 0, 1, 2,..., 7, 우리는 각 행의 여왕이 8개의 상태를 가지고 있다고 믿습니다. 그런 다음 행 0부터 시작하여 위에서 아래로 하위 집합 트리 템플릿을 적용하고 각 행에서 여왕의 8개 상태를 순회하기만 하면 됩니다.
코드:
''' 8皇后问题 ''' n = 8 x = [] # 一个解(n元数组) X = [] # 一组解 # 冲突检测:判断 x[k] 是否与前 x[0~k-1] 冲突 def conflict(k): global x for i in range(k): # 遍历前 x[0~k-1] if x[i]==x[k] or abs(x[i]-x[k])==abs(i-k): # 判断是否与 x[k] 冲突 return True return False # 套用子集树模板 def queens(k): # 到达第k行 global n, x, X if k >= n: # 超出最底行 #print(x) X.append(x[:]) # 保存(一个解),注意x[:] else: for i in range(n): # 遍历第 0~n-1 列(即n个状态) x.append(i) # 皇后置于第i列,入栈 if not conflict(k): # 剪枝 queens(k+1) x.pop() # 回溯,出栈 # 解的可视化(根据一个解x,复原棋盘。'X'表示皇后) def show(x): global n for i in range(n): print('. ' * (x[i]) + 'X ' + '. '*(n-x[i]-1)) # 测试 queens(0) # 从第0行开始 print(X[-1], '\n') show(X[-1])
Rendering
위 내용은 역추적 방법 하위 집합 트리 템플릿을 기반으로 Python의 8-queen 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!