>  기사  >  백엔드 개발  >  역추적 방법 하위 집합 트리 템플릿을 기반으로 Python의 8-queen 문제 해결

역추적 방법 하위 집합 트리 템플릿을 기반으로 Python의 8-queen 문제 해결

巴扎黑
巴扎黑원래의
2017-09-02 11:52:421324검색

이 기사에서는 주로 역추적 방법 하위 집합 트리 템플릿을 기반으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.