import java.util.Scanner;
import java.util.Stack;
/**
* Solución al problema: 10004 - Islas [http://acm.cs.buap.mx]
*
* @author BreakDark (Jhonny Monrroy)
* @version 1.0b 18 feb. 2017
*/
// ACETTADO!!! xD
public class Main {
public static void main(String[] args) {
Scanner Lee; // para leer los datos de entrada
int n; // dimension del mapa
char[][] mapa;
int i; // para los bucles
// AQUI INICIA EL PROGRAMA
Lee = new Scanner(System.in);
do {
n = Lee.nextInt();
if (n > 0) {
mapa = new char[n][n];
for (i = 0; i < n; i++) {
mapa[i] = Lee.next().toCharArray();
}
System.out.println(obtenerSolucion(n, mapa));
}
} while (Lee.hasNext() && n != 0);
Lee.close();
}
/**
* Metodo que obtiene la solucion del problema
*
* @param n
* Dimension del mapa
* @param mapa
* Matriz que representa el mapa
* @return Un String que representa la solucion
*/
public static String obtenerSolucion(int n, char[][] mapa) {
int[][] mp = new int[n][n]; // mapa de numeros
// int[] dimIslas = new int[n * n]; // dimension de las islas
int numIsla = 0;
int i, j; // para los bucles
// recorremos la matriz del mapa
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (mapa[i][j] != 'm') {
// pintamos la isla
if (mp[i][j] == 0) {
// si no esta pintado ya
Stack pila = new Stack();
pila.push(i); // introcucimos la primera coordenada
pila.push(j);
while (!pila.isEmpty()) {
int ind_j = pila.pop();
int ind_i = pila.pop();
// System.out.println(ind_j + "," + ind_i);
// buscamos los alrededores
// coordenada NorOeste
if (ind_i > 0 && ind_j > 0 && mapa[ind_i - 1][ind_j - 1] == 't'
&& mp[ind_i - 1][ind_j - 1] == 0) {
pila.push(ind_i - 1);
pila.push(ind_j - 1);
}
// coordenada Norte
if (ind_i > 0 && mapa[ind_i - 1][ind_j] == 't' && mp[ind_i - 1][ind_j] == 0) {
pila.push(ind_i - 1);
pila.push(ind_j);
}
// coordenada NorEste
if (ind_i > 0 && ind_j + 1 < n && mapa[ind_i - 1][ind_j + 1] == 't'
&& mp[ind_i - 1][ind_j + 1] == 0) {
pila.push(ind_i - 1);
pila.push(ind_j + 1);
}
// Oeste
if (ind_j > 0 && mapa[ind_i][ind_j - 1] == 't' && mp[ind_i][ind_j - 1] == 0) {
pila.push(ind_i);
pila.push(ind_j - 1);
}
// coordenada Este
if (ind_j + 1 < n && mapa[ind_i][ind_j + 1] == 't' && mp[ind_i][ind_j + 1] == 0) {
pila.push(ind_i);
pila.push(ind_j + 1);
}
// coordenada SurOeste
if (ind_i + 1 < n && ind_j > 0 && mapa[ind_i + 1][ind_j - 1] == 't'
&& mp[ind_i + 1][ind_j - 1] == 0) {
pila.push(ind_i + 1);
pila.push(ind_j - 1);
}
// coordenada Sur
if (ind_i + 1 < n && mapa[ind_i + 1][ind_j] == 't' && mp[ind_i + 1][ind_j] == 0) {
pila.push(ind_i + 1);
pila.push(ind_j);
}
// coordenada SurEste
if (ind_i + 1 < n && ind_j + 1 < n && mapa[ind_i + 1][ind_j + 1] == 't'
&& mp[ind_i + 1][ind_j + 1] == 0) {
pila.push(ind_i + 1);
pila.push(ind_j + 1);
}
mp[ind_i][ind_j] = numIsla + 1;
}
numIsla++;
}
}
}
}
// si no hay islas o solo hay una
if (numIsla == 0)
return "No hay islas";
if (numIsla == 1)
return "Solo hay una isla";
// buscamos el menor y la mayor dimension
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for (int isla = 1; isla <= numIsla; isla++) {
int cont = 0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (mp[i][j] > 0 && mp[i][j] == isla)
cont++;
if (cont > 0 && cont < min)
min = cont;
if (cont > max)
max = cont;
}
return min + " " + max;
}
}
Blog dedicado a la publicación de artículos, programas propios, traducciones de Roms de Nes, super Nes y mas, y alguno que otro artículo sobre tecnologia.
Saturday, February 25, 2017
Solución al problema: 10004 - Islas [http://acm.cs.buap.mx] con Java
Para ver el link del problema Click aqui
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment