Estrutura de dados e algoritmo_Recursão_Oito rainhas

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.
Insira a descrição da imagem aqui

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)

Publicado 27 artigos originais · elogiado 2 · visitas 680

Acho que você gosta

Origin blog.csdn.net/qq_44273739/article/details/105173462
Recomendado
Clasificación