AcWing 175. circuitos de servicio (BFS) deque

enlaces a los temas: Haga clic aquí
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

Podemos cada punto de la cuadrícula (punto de intersección de líneas horizontales y verticales) en la placa de circuito es considerado como los nodos grafo no dirigido. Si dos nodos X X y y y es uno de dos pequeños cuadrados en las esquinas, a continuación, X X y y y está conectado entre los bordes. Si el estándar (diagonal) de la caja con X X a y y segmento se solapa con el borde derecho de 0 0 ; si perpendicular, hacia el lado derecho 1 1 (rotación de la necesidad 1 1 veces para conectar). Entonces, nos encontramos con la distancia más corta izquierda a la inferior derecha de la figura de esta conexión, se obtiene la respuesta.

Este es un peso borde es 0 o 1 está gráfico no dirigido. En este mapa, podemos deque amplia búsqueda se calcula. marco general amplio algoritmo general de búsqueda similar, sólo cambió ligeramente la dirección de la extensión de la rama en cada nodo. Si esta rama es el borde pesos 0 lado, poner el nuevo nodo a lo largo de las ramas alcanzan en el equipo de la cabeza de equipo ; si esta rama es los pesos de borde de 1 lado, como una búsqueda amplia en general como desde el extremo del equipo equipo . Como resultado de ello, todavía podemos garantía del valor del nodo colas correspondientes en cualquier momento tener una búsqueda amplia, "dos" y "monótona", cada nodo se abrió por primera vez, se puede llegar a la izquierda en angular distancia más corta al nodo.

Debido a que cada nodo sólo necesita visitar una vez, por lo que el tiempo de complejidad del algoritmo es la ( R C ) O (R * C) .

Esta propiedad también tiene un problema, de hecho, la mitad de la malla grid'll no entrar (como se muestra en puntos rojos), para que pueda juzgar especial.

Los detalles del acuerdo: el número de cada cuadrícula de números y cada punto de la cuadrícula no es lo mismo, prestar atención a la redacción de dos pares de serie de la subasta.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<deque>
#include<algorithm>

using namespace std;
typedef pair<int,int> PII;
const int N = 510;

int dx[] = {-1, -1, 1, 1};      // 当前格点四周的新格点
int dy[] = {-1, 1, 1, -1};

int ix[] = {-1, -1, 0, 0};      // 当前格点四周的格子
int iy[] = {-1, 0, 0, -1};

char cs[5] = "\\/\\/";

int n, m;
char g[N][N];
int d[N][N];
bool st[N][N];                  // 存储每个点的最短路是否已经确定

int bfs()
{
    deque<PII> q;
    memset(d, 0x3f, sizeof d);
    memset(st, false, sizeof st);
    
    q.push_back({0, 0});
    d[0][0] = 0;
    
    while(q.size())
    {
        auto t = q.front();
        q.pop_front();
        
        int x = t.first, y = t.second;       // (x,y)简化后续代码
        
        if(x == n && y == m)    return d[x][y];
        
        if(st[x][y])    continue;
        
        st[x][y] = true;
        
        for(int i = 0; i < 4; ++i)
        {
            int a = x + dx[i], b = y + dy[i];       // (x,y)扩展出的新格点(a,b)
            
            if(a < 0 || a > n || b < 0 || b > m)    continue;
            
            int ga = x + ix[i], gb = y + iy[i];     // (x,y)扩展出的格子(ga,gb)
            
            int dist = d[x][y] + (g[ga][gb] != cs[i]);

            if(dist < d[a][b])
            {
                d[a][b] = dist;

                if(g[ga][gb] != cs[i])  q.push_back({a, b});
                else    q.push_front({a, b});
            }
        }
    }
    
    return -1;      // 不会被执行到
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &n, &m);      // n行m列的格子
        for(int i = 0; i < n; ++i)  scanf("%s", g[i]);
        
        if((n + m) & 1)   puts("NO SOLUTION");
        else    printf("%d\n", bfs());
    }
    
    return 0;
}
Publicados 844 artículos originales · ganado elogios 135 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/qq_42815188/article/details/105082537
Recomendado
Clasificación