Junta [DFS] NOIP2017PJ

Significado de las preguntas: a m * m tablero, por encima de n puntos, cada punto tiene su propio color, el resto de los puntos se incoloro. ¿Cuál es el requisito mínimo de (1,1) a (m, m) costo? Que abarcó dos puntos si el color no toma la misma, si se requiere un color diferente ¥ 1, si el efecto de membrana fundido -. Puede ser un punto próximo al color especificado, mientras que el gasto 2 ¥.

Ideas: Título estado muy claramente que las coordenadas actuales X, Y, el costo actual de los costos, actualmente uso puede magia. Después de la junta es normal que ir, pero necesita la poda o voluntad TLE. La idea más simple es podar

1. Búsqueda de la memoria - grabar las coordenadas actuales de costo mínimo, si varios pases X, Y y encontraron que este costo es mayor que el costo mínimo es decir, el retorno

2. poda de optimalidad - si el costo actual> corriente de corte solución óptima.

// Luogu-juzgador a habilitar-o2 

#include <cstdio> 
#include <cstring> 
#include <cola> int n, m, x, y, c, costo;
int min = 19260817 ;
int hacha [ 4 ] = { 0 , 0 , - 1 , 1 };
int ay [ 4 ] = { 1 , - 1 , 0 , 0 };
int yh [ 105 ] [ 105 ];
int costos [ 105 ] [ 105 ], mapa [

105 ] [ 105 ];
bool vis [ 105 ] [ 105 ]; 


void dfs ( int x, int y, bool Can) {
     si (coste <yh [x] [y]) yh [x] [y] = costo;
    otra  de retorno ;
    si (x == m && y == m) { 
        Min = costo;
        volver ; 
    } 
    Para ( int i = 0 ; i < 4 ; i ++ ) {
         int nx = x + ax [i];
        En tny = y + ay [i];
        si (vis [nx] [ny] || nx> m || ny> m || nx < 1 || ny < 1 ) continúan ;
        Si (Mapa [nx] [NY] =! 0 ) { 
            vis [nx] [NY] = verdadero ;
            si (Mapa [x] [y] == mapa [nx] [ny]) dfs (nx, ny, falsa );
            más {
                 si (costo + 1 > = Min) { 
                    vis [nx] [ny] = false ;
                    continuar ; 
                } 
                costo++ ; 
                dfs (nx, ny, falsa ); 
                costará - ; 
            } 
            Vis [nx] [ny] = false ; 
        } 
        Demás {
             si (Can == cierto ) continuar ;
            si (costo + 2 > = Min) continuar ; 
            Mapa [nx] [ny] = mapa [x] [y]; 
            costo + = 2 ; 
            vis [nx] [ny] = verdadero ; 
            
            dfs (nx, ny, cierto); 
            
            vis [nx] [ny] = false ; 
            MAP [nx] [ny] = 0 ; 
            costo - = 2 ; 
        } 
    } 
} 

Void Read () { 
    scanf ( " % d% d " , & m, y n);
    para ( int i = 1 ; i <= n; ++ i) { 
        scanf ( " % d% d% d " , y x, y y, y c); 
        Mapa [x] [y] = c + 1 ; 
    }     
    Vis [ 1 ] [ 1] = 1 ; 
    memset (YH, 0x3f3f3f , sizeof (yh)); 
} 

Int main () { 
    Read (); 
    dfs ( 1 , 1 , 0 );
    si (Min == 19260817 ) printf ( " -1 \ n " );
    más printf ( " % d \ n " , Min);
    volver  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/LYFer233/p/12627918.html
Recomendado
Clasificación