solución problema ajo total de pasajeros --T1414: Recorte

temas relacionados

tema Enlace

ajo pasajero Total, https://nanti.jisuanke.com/t/T1414 .

Mi DO, http://47.110.135.197/problem.php?id=4768 .

título Descripción

Cuando el rey de ajo se usa para hacer un proyecto de procesamiento de imágenes, ha encontrado un problema, tiene que escoger la imagen de un cable negro en los anillos de la imagen dentro de la región, y ahora le invitan para ayudar a completar el primer paso, los anillos exteriores de la línea de negro toda la zona se vuelve negro. Conocido punto negro en línea de adición figura, no hay imagen negro puro (es decir, píxeles 0 punto).

Formato de entrada

número N de conjuntos de la primera fila de entrada de datos de prueba (0 <N≤10).

La primera línea de cada uno los datos de prueba son dos números enteros W, H representa un ancho de la imagen parte de la mesa y la altura (3≤W≤1440,3≤H≤960).

H filas subsiguientes, teniendo cada fila número entero positivo W, representa el valor de píxel en ese punto. (Pixel valores entre 0 a 255, 0 representa negro y 255 representa blanco).

Formato de salida

Valor de cada píxel en una imagen de salida de matriz de puntos de la región de la caja de negro después de ennegrecimiento.

Ejemplo de entrada

1
5 5
100 253 214 146 120
123 0 0 0 0
54 0 33 47 0
255 0 0 78 0
14 11 0 0 0

Ejemplo de salida

0 0 0 0 0
0 0 0 0 0
0 0 33 47 0
0 0 0 78 0
0 0 0 0 0

tema de análisis

El análisis del significado de problemas

Es H * W en una matriz de 0 fuera de la región rodeada por un no-cero a cero.

Antes de BFS es una zona rodeada por el cambio, para un punto de vista, esta pregunta es en realidad cero a cabo el cambio de los datos. Así que esta pregunta y Luo Gu colorear realidad muy parecidos, a su vez, no es nada.

Por lo tanto, puede hacerse referencia pintó el color del título del programa, con una capa en la periferia, pero esta capa no es cero, pero distinto de cero. A continuación, a partir de (0,0) para iniciar todos BFS región diferente de cero.

explicaciones más detalladas solicitantes pueden referirse a mi coloración previa y por escrito, https://blog.csdn.net/justidle/article/details/104764162 .

El núcleo del problema, por tanto, se convierte, en la periferia con una capa de datos distintos de cero, la matriz H * tamaño W se convierte en el tamaño de la (H + 1) * (W + 1) es.

código de referencia AC

Como la cuestión especial, y el control de la visibilidad por lo tanto puede no ser necesaria, fijamos a cero por los datos, que muestra el control de acceso.

uso BFS

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

const int MAXW = 1444;
const int MAXH = 964;

typedef struct _MAZE {
    int w, h;
    int data[MAXH][MAXW];
} MAZE;

MAZE maze;

typedef struct _POS {
    int x,y;
} POS;

//x,y表示起点位置
void bfs(int x, int y) {
    queue<POS> q;
    //从0,0开始遍历
    POS cur={x,y};
    maze.data[x][y]=0;
    q.push(cur);

    POS next;
    const POS moves[] = {{-1,0},{0,-1},{1,0},{0,1}};

    while (false==q.empty()) {
        cur = q.front();
        q.pop();

        for (int i=0; i<4; i++) {
            next.x = cur.x+moves[i].x;
            next.y = cur.y+moves[i].y;

            if (next.x>=0 && next.x<=maze.h+1 &&
                next.y>=0 && next.y<=maze.w+1 &&
                maze.data[next.x][next.y]>0) {
                maze.data[next.x][next.y]=0;
                q.push(next);
            }
        }
    }
}

int main() {
    int n;
    cin >> n;
    
    for (int i=0; i<n; i++) {
        memset(maze.data, 1, sizeof(maze.data));

        cin>>maze.w>>maze.h;
        for (int j=1; j<=maze.h; j++) {
            for (int k=1; k<=maze.w; k++) {
                cin>>maze.data[j][k];
            }
        }

        bfs(0, 0);

        //输出
        for (int j=1; j<=maze.h; j++) {
            for (int k=1; k<=maze.w; k++) {
                cout << maze.data[j][k] << " ";
            }
            cout << endl;
        }
    }
    
    return 0;
}

El uso de DFS

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

const int MAXW = 1444;
const int MAXH = 964;

typedef struct _MAZE {
    int w, h;
    int data[MAXH][MAXW];
} MAZE;

MAZE maze;

typedef struct _POS {
    int x,y;
} POS;

void dfs(int x, int y) {
    const POS moves[] = {{-1,0},{0,-1},{1,0},{0,1}};
    int xx, yy;
    for (int i=0; i<4; i++) {
        xx = x+moves[i].x;
        yy = y+moves[i].y;

        if (xx>=0 && xx<=maze.h+1 &&
            yy>=0 && yy<=maze.w+1 &&
            maze.data[xx][yy]>0) {
            maze.data[xx][yy]=0;
            dfs(xx, yy);
        }
    }
}

int main() {
    int n;
    cin >> n;
    
    for (int i=0; i<n; i++) {
        memset(maze.data, 1, sizeof(maze.data));

        cin>>maze.w>>maze.h;
        for (int j=1; j<=maze.h; j++) {
            for (int k=1; k<=maze.w; k++) {
                cin>>maze.data[j][k];
            }
        }

        maze.data[0][0]=0;
        dfs(0, 0);

        //输出
        for (int j=1; j<=maze.h; j++) {
            for (int k=1; k<=maze.w; k++) {
                cout << maze.data[j][k] << " ";
            }
            cout << endl;
        }
    }
    
    return 0;
}

La diferencia entre BFS y DFS

Tal tema es mejor utilizar BFS. Si DFS, cuando una gran cantidad de tiempo de datos, DFS pila de recursión puede provocar una explosión. Generalmente, cuando la profundidad de recursión más de 2500 capas, la DFS se echó fácilmente pila.

resumen

Encontrar problemas de conectividad finales idea es utilizar un BFS o detectar la unión. En lugar de utilizar DFS.

Publicados 235 artículos originales · ganado elogios 289 · Vistas 1,07 millones +

Supongo que te gusta

Origin blog.csdn.net/justidle/article/details/104860153
Recomendado
Clasificación