base ley fortuna class5- isla izquierda del título 5

1. Título: Problema de la isla

Sólo dos tipos de valores 0 y 1 en una matriz, y cada lugar puede ser dueño de arriba, abajo, izquierda y derecha posición están conectados, si hay un 1 en conjunto, esta parte se llama una isla, Buscando una matriz tiene cuántas islas?
Por ejemplo:
0 0 0. 1. 1 0
. 1. 1. 1 0 0. 1
. 1. 1 0 0 0 0
0 0 0 0 0 0
La matriz tiene tres islas.

2. Análisis

Pensando en esta pregunta es muy simple, cada elemento de la matriz es atravesada. Si el elemento actual es 1, el número de islas más 1, entonces el elemento actual al 2 (indica que la isla había sido registrado), recursiva buscar hacia arriba y hacia abajo cuatro de sus elementos, si hay elementos de 1, continúe 2 (fase o 1 es la misma isla, se ha grabado más), constantemente arriba y abajo sobre cuatro elementos recursiva hasta que el elemento no es 1 o mirar hacia fuera de los límites.

código 3. núcleo

(1) La recursividad Island

Nos función recursiva se define como Infect, infectar a la misma función que la función, si el elemento que se encuentra es 1, seguirá mirar si hay elementos de los cuatro elementos en torno a un valor de 1.
Nota:
el retorno directo recursiva Condiciones ① es un conjunto de elemento transfronterizo y el valor actual no es 1;
② necesidad de primer valor del elemento actual al 2 de forma recursiva, o va a seguir investigando para el bucle

void infect(int a[][width],int j,int i)  //传二维数组需将第二维指定
{
	if(j < 0||j >= width ||i < 0|| i >= height || a[i][j] != 1)
		return;
	a[i][j] = 2;
	//查找上下左右四个元素
	infect(a,j - 1,i);
	infect(a,j + 1,i);
	infect(a,j,i - 1);
	infect(a,j,i + 1);
}

(2) el número de la demanda de la isla

Para atravesar la matriz, si encontramos elementos de los elementos del valor 1, el número de islas aumenta en 1 y llama a la función recursiva para encontrar toda la isla. Por último, devolver el número de islas.

int countIslands(int a[][width])
{
	int num = 0;
	for(int i = 0;i < height;i++)
	{
		for(int j = 0;j < width;j++)
		{
			if(a[i][j] == 1)
			{
				num++;
				infect(a,j,i);
			}
		}
	}
	return num;
}

4. El código completo

#include<iostream>
//#include<vector>
using namespace std;
#define width 6
#define height 4

void infect(int a[][width],int j,int i)
{
	if(j < 0||j >= width ||i < 0|| i >= height || a[i][j] != 1)
		return;
	a[i][j] = 2;
	infect(a,j - 1,i);
	infect(a,j + 1,i);
	infect(a,j,i - 1);
	infect(a,j,i + 1);
}

int countIslands(int a[][width])
{
	int num = 0;
	for(int i = 0;i < height;i++)
	{
		for(int j = 0;j < width;j++)
		{
			if(a[i][j] == 1)
			{
				num++;
				infect(a,j,i);
			}
		}
	}
	return num;
}

int main()
{
	int a[height][width] = {
		{0,0,1,0,1,0},
		{1,1,1,0,1,0},
		{1,0,0,1,0,0},
		{0,0,0,0,0,0}};
	cout<<countIslands(a);

	system("pause");
	return 0;
}

5. Extensión: Problemas paralelas

Si usted pide una gran cantidad de la forma de resolver la matriz. Usando el pensamiento paralelo, la isla está dividida en n, por separado. Isla en la frontera será más probable que se considere, ya que si la isla vecina en la frontera es 1, cada parte se registra por separado, la suma de lo cobrado de. La solución es: variables de diseño, registra al inicio de cada isla. Este reexamen cuando el límite, si dos islas diferentes posiciones, el número de islas menos 1 (en realidad una isla) de partida, a continuación, los mismos dos islas fusionan posición inicial.

Publicado 51 artículos originales · ganado elogios 1 · vistas 1367

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/104226582
Recomendado
Clasificación