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.