NYOJ 27-Número de grupos (DFS simple)

Enlace de tema:

http://acm.nyist.net/JudgeOnline/problem.php?pid=27

Numero de piscinas

Límite de tiempo: 3000  ms | Límite de memoria: 65535  KB
Dificultad: 4
descripción
Hay algunos ríos pequeños y algunos lagos en el campus del Instituto de Tecnología de Nanyang. Ahora, los tomamos como piscinas. Supongamos que hay un mapa de alguna parte de nuestra escuela. Este mapa solo indica si es una piscina o no. Ahora , tu La tarea está por llegar. Usa la computadora para averiguar cuántos grupos hay en el mapa.
ingresar
Una primera línea del entero de entrada N, el total de N conjuntos de datos de prueba
para cada conjunto de datos son los primeros en ingresar el número de filas del mapa m (0 <m <100) y el número de columna n (0 <n <100) , luego ingrese Ingrese n números en cada línea de las siguientes m líneas, indicando si hay agua o no hay agua (1 significa que esto es una piscina, 0 significa que este es el suelo)
Producción
Muestra el número de piscinas en el mapa.
Cabe señalar que si los lados de cada grupo (cuatro posiciones arriba, abajo, izquierda y derecha) siguen siendo grupos, se pueden considerar como el mismo grupo.
Entrada de muestra
2 
3 4 
1 0 0 0 
0 0 1 1 
1 1 1 0 
5 5 
1 1 1 1 0 
0 0 1 0 1 
0 0 0 0 0 
1 1 1 0 0 
0 0 1 1 1
Salida de muestra
2 
3
//典型的求连通块,DFS
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int s[105][105];
int vis[105][105];
int di[][2] = {
      
      {1,0},{-1,0},{0,1},{0,-1}};
int m, n;

int valid(int x, int y)
{
	if(x<0||x>=m||y<0||y>=n)
		return 0;
	return 1;
}

void dfs(int x, int y)
{
	vis[x][y] = 1;
	for(int i=0; i<4; i++)
	{
		int xx = x+di[i][0];
		int yy = y+di[i][1];
		if(s[xx][yy]==1&&valid(xx, yy)&&!vis[xx][yy])
		{
			dfs(xx, yy);
		}
	}
}

int main()
{
	int N;
	scanf("%d", &N);
	while(N--)
	{
	    memset(vis, 0, sizeof(vis));
		scanf("%d%d", &m, &n);
		for(int i=0; i<m; i++)
			for(int j=0; j<n; j++)
				scanf("%d", &s[i][j]);
        int ans = 0;
		for(int i=0; i<m; i++)
			for(int j=0; j<n; j++)
				if(!vis[i][j]&&s[i][j]==1)
				{
					dfs(i, j);
					ans++;
				}
		printf("%d\n", ans);
	}
	return 0;
}



Supongo que te gusta

Origin blog.csdn.net/qq_31281327/article/details/76337352
Recomendado
Clasificación