Estructura de datos y algoritmo_Recursion_Oight Queen

Descripción del problema

Introducción al problema de las
ocho reinas El problema de las ocho reinas es un problema antiguo y bien conocido, que es un caso típico del algoritmo de retroceso. El problema fue planteado por el jugador de ajedrez internacional Max Bethel en 1848: colocando ocho reinas en un tablero de ajedrez de 8 × 8 para evitar que se ataquen entre sí, es decir, dos reinas no pueden estar en la misma línea , En la misma columna o en la misma barra inclinada, pregunte cuántos péndulos hay.
Inserte la descripción de la imagen aquí

Análisis mental

Debido a que el ajedrez es un tablero de 8 * 8, y un total de 8 reinas deben colocarse en el tablero. Entonces debe haber solo una reina en cada fila, luego puede usar directamente una matriz unidimensional, utilizando su subíndice para representar el número de filas, y el valor de la matriz representa el número de columnas correspondientes a cada fila.
Los pasos específicos son los siguientes:
1) La primera reina se coloca en la primera columna de la primera fila
2) La segunda reina se coloca en la primera columna de la segunda fila y luego juzga si está bien; si no está bien, muévase horizontalmente hacia la derecha hasta Encuentre una posición adecuada
3) Continúe hasta la tercera reina, o repita la operación de la segunda línea, y al mismo tiempo determine si hay un conflicto con la primera línea y la segunda línea hasta que encuentre una posición adecuada
4) Cuando obtenga una solución correcta, en Cuando la pila retrocede a la pila anterior, comenzará a retroceder, es decir, colocar todas las soluciones de la primera reina en la primera fila, todas obtienen
5) y luego colocar a la primera reina en la segunda columna, y luego ejecutar 1 en el bucle. 2, 3, 4 pasos

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)

27 artículos originales publicados · elogiados 2 · visitas 680

Supongo que te gusta

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