Ir a la cuadrícula (bfs + dji)

Título Descripción
CYJ quiere encontrar a su pequeño compañero FPJ. CYJ y FPJ están ahora en una habitación. El diseño de esta habitación puede verse como una matriz de N filas y columnas M. Cada elemento en la matriz será uno de los siguientes casos :
1. Área de obstáculo: hay una pared (indicada con '#')
2. Esta es el área donde CYJ era originalmente (indicada con 'C')
3. Esta es el área donde está FPJ (indicada con 'F' ).
4. área vacía (con '' representación).
CYJ lleva un llamado cosa pistola de transferencia, es posible crear un portal de armas de fuego, en cada acción, se puede seleccionar una de las siguientes acciones :
1. Mover a una cuadrícula adyacente (arriba, abajo, izquierda, derecha, no se puede mover a la cuadrícula donde está el muro). Esta operación consume una unidad de tiempo.
2. Girar a un muro (no es necesario ser adyacente, Solo enfréntalo), inicia el portal hacia él, el portal permanecerá en la pared frente a ti (a lo sumo solo puede haber dos portales al mismo tiempo), si ya hay dos portales en la pared y disparaste El tercer ventilador, luego el que se lanzó originalmente, desaparecerá. Al mismo tiempo, no puede hacer dos portales en una ubicación (esta operación no llevará tiempo).
3. Si está adyacente a una pared y hay un portal frente a él, entonces puede moverse a la cuadrícula frente a otro portal. Esta operación tomará una unidad de tiempo.
CYJ quiere saber cuánto tiempo lleva llegar desde el punto de partida ('C') hasta el punto final ('F').
Tenga en cuenta: garantizamos que el borde del mapa será un círculo de paredes y debe existir 'C', 'F'.

Entrada La
primera línea ingresa dos enteros positivos N y M, (4 ≤ N, M ≤ 500). Representa el tamaño del mapa.
Cada una de las siguientes N líneas tiene una cadena de longitud M. Representa el terreno.

Salida
Debe generar el tiempo mínimo para llegar al punto final, si no puede alcanzar, envíe "no".

Entrada de muestra
[Muestra 1]
4 4

# .F #
# C. #

[Muestra 2]
6 8
########
#. ##… F #
#C. ##… #
#… #… #
#… ##
########
[样例 3]
4 5

#C #. #
### F #

Salida de muestra
[Muestra 1]
2
[Muestra 2]
4
[Muestra 3]
no

Consejo
Ejemplo 2 explicado:
comenzando desde el punto C (3, 2), primero lanzamos el portal hacia la izquierda, luego lanzamos el portal hacia abajo, ingresamos al portal hacia la izquierda, llegamos a (5, 2), lanzamos el portal hacia la derecha, Ingrese el portal hacia abajo, alcance (5, 6), inicie el portal hacia arriba, ingrese el portal hacia la derecha, alcance (2, 6), muévase hacia la derecha, alcance F.
Inserte la descripción de la imagen aquí
[Rango de datos]
50% de los datos se encuentran: 4 < = N, M <= 15;
100% de los datos se encuentran: 4 <= N, M <= 500;

Ideas
para cada punto de no-pared, hay ocho maneras, incluso de costado, es decir, cuatro direcciones hacia arriba y hacia abajo, o paso de las cuatro direcciones de la pared más cercana punto de medida, incluso después de un lado, que se ejecutan directamente Dijkstra Puede

Implementación de código

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=505;
const int M=3e5;
const int INF=0x3f3f3f3f;
const ll LINF=1e18;
const ull sed=31;
const ll mod=998244353;
const double eps=1e-7;
const double PI=3.14159265358979;
typedef pair<int,int>P;
typedef pair<double,double>Pd;

template<class T>void read(T &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return;
}
struct qnode
{
    int v,c;
    qnode(int _v=0,int _c=0):v(_v),c(_c){}
    bool operator < (const qnode &r) const
    {
        return c>r.c;
    }
};

struct node
{
    int to,index,w;
}E[M<<3];

int head[M],cnt,n,m;
int dis[M],dist[N][N];
P cw[4][N][N];
int ar[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
bool vis[M];
char mp[N][N];
int s,e;
queue<P>que;

inline int cal(P t)
{
    return (t.first-1)*m+t.second;
}
void add(int u,int v,int w)
{
    E[++cnt].to=v;
    E[cnt].w=w;
    E[cnt].index=head[u];
    head[u]=cnt;
}

void dji()
{
    for(int i=1;i<=n*m;i++)
    {
        dis[i]=INF;
        vis[i]=false;
    }
    priority_queue<qnode>que;
    que.push(qnode(s,0));
    dis[s]=0;
    while(!que.empty())
    {
        qnode top=que.top();
        que.pop();
        int u=top.v;
        if(vis[u]) continue;
        vis[u]=true;
        for(int i=head[u];i;i=E[i].index)
        {
            int v=E[i].to,cost=E[i].w;
            if(!vis[v] && dis[v]>dis[u]+cost)
            {
                dis[v]=dis[u]+cost;
                que.push(qnode(v,dis[v]));
            }
        }
    }
}

void bfs()
{
    while(!que.empty())
    {
        P top=que.front();
        que.pop();
        for(int i=0;i<4;i++)
        {
            int ax=top.first+ar[i][0],ay=top.second+ar[i][1];
            if(ax>0 && ay>0 && ax<=n && ay<=m && !dist[ax][ay] && mp[ax][ay]=='.')
            {
                dist[ax][ay]=dist[top.first][top.second]+1;
                que.push(P(ax,ay));
            }
        }
    }
}


int main()
{
    read(n);read(m);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",mp[i]+1);
        for(int j=1;j<=m;j++)
        {
            if(mp[i][j]=='C')
            {
                mp[i][j]='.';
                s=cal(P(i,j));
            }
            else if(mp[i][j]=='F')
            {
                mp[i][j]='.';
                e=cal(P(i,j));
            }
            else if(mp[i][j]=='#') que.push(P(i,j));
        }
    }
    bfs();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mp[i][j]=='#') continue;
            for(int k=0;k<2;k++)
            {
                int ax=i+ar[k][0],ay=j+ar[k][1];
                if(ax>0 && ay>0 && ax<=n && ay<=m)
                {
                    if(mp[ax][ay]=='#') cw[k][i][j]=P(i,j);
                    else cw[k][i][j]=cw[k][ax][ay];
                }
            }
        }
    }
    for(int i=n;i>0;i--)
    {
        for(int j=m;j>0;j--)
        {
            if(mp[i][j]=='#') continue;
            for(int k=2;k<4;k++)
            {
                int ax=i+ar[k][0],ay=j+ar[k][1];
                if(ax>0 && ay>0 && ax<=n && ay<=m)
                {
                    if(mp[ax][ay]=='#') cw[k][i][j]=P(i,j);
                    else cw[k][i][j]=cw[k][ax][ay];
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mp[i][j]=='#') continue;
            for(int k=0;k<4;k++)
            {
                int ax=i+ar[k][0],ay=j+ar[k][1];
                if(k>=2 && ax>0 && ay>0 && ax<=n && ay<=m && mp[ax][ay]=='.')
                {
                    add(cal(P(ax,ay)),cal(P(i,j)),1);
                    add(cal(P(i,j)),cal(P(ax,ay)),1);
                }
                if(cw[k][i][j]!=P(i,j)) add(cal(P(i,j)),cal(cw[k][i][j]),dist[i][j]);
            }
        }
    }
    dji();
    if(dis[e]==INF) puts("no");
    else printf("%d\n",dis[e]);
    return 0;
}

235 artículos originales publicados · Me gusta 13 · Visitas 20,000+

Supongo que te gusta

Origin blog.csdn.net/weixin_43935894/article/details/105623155
Recomendado
Clasificación