Retrocediendo y ramificando y atando

La descripción simple de la idea del método de retroceso es: transformar el espacio de solución del problema en una representación gráfica o de estructura de árbol, y luego usar la estrategia de búsqueda en profundidad para recorrer, registrar y encontrar todas las soluciones factibles o soluciones óptimas durante el proceso de recorrido.

La idea básica es similar a:

  • Primera búsqueda de profundidad de gráfico
  • Recorrido posterior al orden del árbol binario

El método de retroceso busca en el árbol de espacio de solución del problema de acuerdo con la estrategia de profundidad primero. Primero, el árbol de espacio de solución se busca desde el nodo raíz. Cuando el algoritmo busca un nodo del árbol de espacio de solución, primero use la función de poda para determinar si el nodo es factible (es decir, puede obtener la solución del problema). Si no es factible, omita la búsqueda del subárbol enraizado en el nodo y retroceda a su nodo ancestro capa por capa; de lo contrario, ingrese al subárbol y continúe buscando de acuerdo con la estrategia de profundidad primero.

El comportamiento básico del método de retroceso es la búsqueda. El proceso de búsqueda utiliza funciones de poda para evitar búsquedas no válidas. Las funciones de poda incluyen dos tipos: 1. Utilice funciones de restricción para cortar trazados que no cumplan con las restricciones; 2. Utilice funciones vinculadas para cortar Ir al camino que no puede obtener la solución óptima.

La clave del problema es cómo definir el espacio de solución del problema y transformarlo en un árbol (es decir, árbol de espacio de solución). El árbol de espacio de solución se divide en dos tipos: árbol de subconjunto y árbol de permutación. Los dos algoritmos son aproximadamente lo mismo en estructura y pensamiento.

[Ejemplo] Problema de 8 reinas. Hay 8 × 8 8 \ times 88×Coloca 8 reinas en un tablero de ajedrez con 8 casillas para que dos reinas no puedan atacarse entre sí, es decir, no puede haber más de dos reinas en la misma fila y columna. No puede haber más de dos reinas en la línea paralela. Prueba para dar todos los métodos de colocación.

【solución】

Inserte la descripción de la imagen aquí

Deje xxx representa el subíndice de fila,yyy representa el subíndice de la columna, entonces podemos obtener la restricción: para dos posiciones cualesquiera(xi, yi) (x_i, y_i)( xyo,yyo)(xj, yj) (x_j, y_j)( xj,yj), 有
{xi ≠ xjyi ≠ yj ∣ xi - xj ∣ ≠ ∣ yi - yj ∣ \ begin {cases} x_i \ ne x_j \\ \\ y_i \ ne y_j \\ \\ | x_i-x_j | \ ne | y_i - y_j | \ end {casos}Xyo=Xjyyo=yjxyo-Xj=yyo-yj|
Lo siguiente es definir la estrategia de búsqueda y luego bifurcar y enlazar según las restricciones.

La idea más sencilla es comenzar a colocar la primera reina hasta que se coloque la octava reina.

Podemos especificar que de la primera a la octava reinas están en la primera a la octava columna respectivamente, luego solo necesitamos resolver la disposición apropiada del número de fila.

void queen(int row){
    
    
    if(row==8){
    
    
        total++;
    }else{
    
    
        for(int col=0; col!=8; col++){
    
    
            c[row]=col;
            if(is_ok(row)){
    
    
                queen(row+1);
            }
        }  
    }
}

Las llamadas queen(0)a problemas específicos solo una mínima modificación del código resolverán el problema.

Supongo que te gusta

Origin blog.csdn.net/dreaming_coder/article/details/114378802
Recomendado
Clasificación