Codeforces Ronda # 619 (Div. 2) F

El significado de los problemas

norte * metro Nuevo Méjico rejilla, cada rejilla tiene un color, el mismo color puede alcanzar o ir rejilla directamente adyacente, la distancia más corta entre la pluralidad de requisitos de puntos de interrogación.

solución del problema

En primer lugar, tenemos la tendencia a pensar en la búsqueda de la distancia entre dos colores, pero de esta manera no es un buen mantenimiento.
La respuesta es debido a la incertidumbre re yo s + 1 dis + 1 o re yo s + 2 dis + 2 o re yo s dis
nos capa adicional de información, tarjetas de memoria mantienen una distancia mínima para todos los puntos de color.
Esto puede ser un multi-fuente si F s BFS mantenimiento, la llegada de cada nuevo color, poner el mismo color en toda la actualización de puntos.
Y de acuerdo con si F s BFS naturaleza, la primera distancia mínima que sea constante, por lo que ya no actualiza después de que el color.

Después de la búsqueda de que todavía no estamos seguros re yo s + 1 dis + 1 o re yo s dis .
Si no se utiliza el color a través de, la respuesta es la distancia Manhattan.
Si se utiliza, el cual consideramos un color enumeración con un salto, entonces la respuesta es re yo s [ yo ] [ l ] + re yo s [ yo ] [ r ] + 1 dis [i] [l] + dis [i] [r] 1
representa yo yo del color a la izquierda punto y punto a la derecha a través de las contribuciones más.

Esa es la respuesta para tomar el mínimo, porque la mayoría son en cortocircuito-uno al otro por lo que esta petición es posible.

#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
typedef long long ll;
using namespace std;

const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const int maxk = 40+2;
const int maxn = 1000+2;

int n,m,k;
int dp[maxk][maxn][maxn];
int col[maxn][maxn],vis[maxn][maxn],flag[maxn];
vector<pair<int,int> >G[maxk];

int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};

void bfs(int c){
    queue<pair<pair<int,int>,int> >q;
    for(auto x:G[c])q.push(make_pair(make_pair(x.first,x.second),0));
    memset(vis,0,sizeof(vis));
    memset(flag,0,sizeof(flag));
    memset(dp[c],0x3f,sizeof(dp[c]));
    while(!q.empty()){
        int nowx=q.front().first.first,nowy=q.front().first.second,val=q.front().second;q.pop();
        if(vis[nowx][nowy])continue;vis[nowx][nowy]=true;
        dp[c][nowx][nowy]=val;
        if(!flag[col[nowx][nowy]]){
            flag[col[nowx][nowy]]=true;
            for(auto v:G[col[nowx][nowy]]){
                q.push(make_pair(make_pair(v.first,v.second),val+1));
            }
        }
        for(int i=0;i<4;i++){
            int x=nowx+dx[i],y=nowy+dy[i];
            if(x<1||x>n||y<1||y>m)continue;
            if(vis[x][y])continue;
            q.push(make_pair(make_pair(x,y),val+1));
        }
    }
}

int main(){
    cin>>n>>m>>k;
    FOR(i,1,n)FOR(j,1,m)scanf("%d",&col[i][j]),G[col[i][j]].push_back(make_pair(i,j));
    FOR(i,1,k)bfs(i);
    int q;cin>>q;
    while(q--){
        int r1,c1,r2,c2;scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
        if(r1==r2&&c1==c2)puts("0");
        else if(col[r1][c1]==col[r2][c2])puts("1");
        else{
            int ans=abs(r1-r2)+abs(c1-c2);
            for(int i=1;i<=k;i++)ans=min(ans,dp[i][r1][c1]+dp[i][r2][c2]+1);
            printf("%d\n",ans);
        }
    }
}

Publicados 203 artículos originales · ganado elogios 17 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/mxYlulu/article/details/104325081
Recomendado
Clasificación