DFS etiquetado

DFS etiquetado

Enlace de asunto: https://codeforces.com/contest/616/problem/C

Pregunta:
Darle una matriz de n filas ym columnas, la matriz * representa obstáculos y. Representa un espacio abierto.
Para cada obstáculo, déjelo salir después de quitar el obstáculo (este punto se cuenta como un punto vacío), el tamaño del bloque conectado en este punto es Cuánto
Nota: Cada punto de obstáculo se maneja por separado y la respuesta necesita% 10

Idea:
Al principio pensé en BFS directamente, pero debería ser T, así que me pregunto si puedo cambiar el método.

Solución positiva:
Encuentra el número de cuadrados de cada bloque de interconexión, de modo que al encontrar el tamaño del bloque de interconexión correspondiente al obstáculo, puedas calcular directamente el tamaño del bloque de interconexión a su alrededor.

Nota:
1. Para cada obstáculo, los bloques conectados de cuatro cuadrículas adyacentes pueden ser iguales. En este caso, se puede usar una matriz f [] [] para registrar cuál es el primer bloque conectado para eliminar duplicados
2. Cada vez que dfs busque, ponga puntos vacíos en la cola y actualice el número de puntos que se han buscado en cualquier momento (el último es el tamaño del bloque Unicom). Una vez completado este dfs, este tamaño de bloque Unicom se asigna a cada punto de la cola.

Código AC:

#include<iostream>
#include<cstdio>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>
#include<map>
using namespace std;
#define scan(n) scanf("%d",&n)
#define ll long long

struct ss
{
    
    
    int r,c;
};
typedef struct ss ss;

queue<ss> q;
int a[1005][1005];
int num[1005][1005];
int r[1005][1005];
int f[1005][1005];
int cnt;
int n,m;
int tot=1;

void dfs(int i,int j)
{
    
    
    if(i<1||i>n||j<1||j>m)
        return;
    if(num[i][j])
        return;
    if(a[i][j]==1)
        return;
    ss s;
    s.r=i;
    s.c=j;
    q.push(s);
    cnt++;
    num[i][j]=1;
    dfs(i+1,j);
    dfs(i-1,j);
    dfs(i,j+1);
    dfs(i,j-1);
    return;
}

int main()
{
    
    
    int i,j;
    char ch;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
    
    
            cin>>ch;
            if(ch=='*')
                a[i][j]=1;
            else
                a[i][j]=0;
        }
    memset(num,0,sizeof(num));
    for(i=1;i<=n;i++)
    {
    
    
        for(j=1;j<=m;j++)
        {
    
    
            if(a[i][j]==0&&num[i][j]==0)
            {
    
    
                cnt=0;
                dfs(i,j);
                while(!q.empty())
                {
    
    
                    ss s=q.front();
                    q.pop();
                    int rr=s.r;
                    int cc=s.c;
                    num[rr][cc]=cnt;
                    f[rr][cc]=tot;
                }
                tot++;
            }
        }
    }
    for(i=1;i<=n;i++)
    {
    
    
        for(j=1;j<=m;j++)
        {
    
    
            r[i][j]=num[i-1][j];
            int f1=f[i-1][j],f2=f[i+1][j],f3=f[i][j-1],f4=f[i][j+1];
            if(f2!=f1)
                r[i][j]+=num[i+1][j];
            if(f3!=f1&&f3!=f2)
                r[i][j]+=num[i][j-1];
            if(f4!=f1&&f4!=f2&&f4!=f3)
                r[i][j]+=num[i][j+1];
            r[i][j]++;
            r[i][j]%=10;
        }
    }
    for(i=1;i<=n;i++)
    {
    
    
        for(j=1;j<=m;j++)
        {
    
    
            if(a[i][j]==1)
                cout<<r[i][j];
            else
                cout<<'.';
        }
        cout<<endl;
    }
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_40534166/article/details/97816262
Recomendado
Clasificación