Descrição do problema
Introdução ao
problema das Oito Rainhas O problema das Oito Rainhas é um problema antigo e bem conhecido, que é um caso típico do algoritmo de retorno. O problema foi levantado pelo jogador de xadrez internacional Max Bethel em 1848: colocar oito rainhas em um xadrez de grade 8 × 8 para impedir que se atacassem, ou seja, quaisquer duas rainhas não podem estar na mesma linha , Na mesma coluna ou na mesma barra, pergunte quantos pêndulos existem.
Análise mental
Como o xadrez é um tabuleiro 8 * 8, e um total de 8 rainhas precisam ser colocadas no tabuleiro. Depois, deve haver apenas uma rainha em cada linha, e você pode usar diretamente uma matriz unidimensional, usando seu subscrito para representar o número de linhas, e o valor da matriz representa o número de colunas correspondentes a cada linha.
As etapas específicas são as seguintes:
1) A primeira dama é colocada na primeira coluna da primeira linha.
2) A segunda dama é colocada na primeira coluna da segunda linha e, em seguida, julga se está OK; se não estiver OK, mova horizontalmente para a direita até Encontre uma posição adequada
3) Continue até a terceira rainha ou repita a operação da segunda linha e, ao mesmo tempo, determine se há um conflito com a primeira linha e a segunda linha até encontrar uma posição adequada
4) Quando você encontrar uma solução correta, em Quando a pilha reverter para a pilha anterior, ela começará a recuar, ou seja, coloque todas as soluções da primeira dama na primeira linha, todas obterão
5) e, em seguida, coloque a primeira dama na segunda coluna e depois executará 1 no loop. 2, 3, 4 etapas
Código específico:
import math
class Queue(object):
def __init__(self):
self.cnt = 0#统计八个皇后的满足要求的摆放方式的个数
self.maxn = 8#数组的最大长度
self.array = [0 for i in range(8)]#数组下标代表行,每个下标的值为列
'''
打印皇后位置数组
'''
def Print(self):
for i in range(len(self.array)):
print("%d "%self.array[i],end='')
print()
'''
判断当前皇后位置和前几个皇后的位置是否冲突
'''
def judge(self,n):
for i in range(n):
if self.array[i]==self.array[n] or abs(n-i)==abs(self.array[n]-self.array[i]):
return False
return True
'''
回溯递归
'''
def check(self,n):
if n==self.maxn:
self.cnt+=1
self.Print()
return
for i in range(self.maxn):
self.array[n]=i
if self.judge(n):
self.check(n+1)
q = Queue()
q.check(0)
num = q.cnt
print('总共:%d'%num)