[ Foro de Pascal ]
Cordial saludo.
Profesores tengo un problema que me dejaron en el instituto,y bueno tengo algunas ideas las cuales quiero plantearselas ,para que con su ayuda pueda dar solucion a este ejecicio agradeciendo como bien sabemos todos los compañeros que acudimos a su valioso tiempo y el cual agradecemos pues sus respuestas son muy completas y entendibles para nosotros que estamos en este proceso de aprendizaje.
se tiene un matriz de tamaño n*m de ceros y unos,donde 0 representa agua y 1 tierra. una isla es una agrupacion de celdas( almenos una) con un valor 1, cada una de las cuales es adyacente horizontal y/o verticalmente a una celda del mismo grupo.una isla esta delimitada horizontalmente y verticalmente por celdas con un valor cero (0) o por los limites frontera de la matriz.
porejemplo:
1 2 3 4 5 6 7 8 9 10
1 1 1 1 0 0 1 1 1 1 1
2 1 1 0 0 0 0 1 0 0 1
3 0 0 0 1 0 0 1 0 0 0
4 0 0 0 0 1 0 1 0 0 0
5 1 1 1 0 0 0 1 1 0 1
en este ejemplo hay 6 islas compuestas de las siguientes celdas,cuyas coordenadas son:
isla 1:(1,1)(1,2)(1,3)(2,1)(2,2)
isla 2:(3,4)
isla 3:(4,5)
isla 4:(5,1)(5,2)(5,3)
isla 5:(1,6)(1,7)(1,8)(1,9)(1,10)(2,7)(2,10)(3,7)(4,7)(5,7)(5,8)
isla 6:(5,10)
notar que (3,4) y (4,5) no forman una sola isla sino que son dos islas distintas.
se pide que el programa imprima las celdas de cada isla de la matriz siguiendo el formato del ejemplo.
Bien yo estoy haciendo algo como esto:
program islas;
uses crt;
var
A:array[1..n,1..m]:integer
cantidadislas,i:integer
n,m:integer //representan numero de filas y columnas matriz
fil,col:integer;
begin
cantidadislas:=0;
for i:=1 to n do
for j:=1 to m do
visitado[i,j]:=0;//inicializo sectores visitados de la matriz
for fil:=1 to n do
for col:=1 to m do
{ si encontre un sector con tierra }
if (A[fil,col]=1) and (visitado[fil,col]=0) then
begin
cantidadislas:=cantidadislas+1;
imprimirisla(A,fil,col,visitado);
end
else
visitado[fil,col]:=1;
pues bien profesores hasta este punto del codigo llega mi duda es la siguiente:
como podria realizar el procedimiento o funcion imprimirisla? o si os se les ocurre una idea mejor para poder solucionar el ejercicio?
tengo algunas ideas como porejemplo ir avanzando a traves de los cuatro posibles movimientos este oeste sur norte, es decir
porejemplo si intento avanzar al oeste seria algo asi:
if (col+1 < m )and (A[fil,col+1]=1) and (visitado[fil,col+1]=0) then
imprimirisla(A,fil,col+1,visitado);
para avanzar porejemplo al norte :
if (fil>0) and (A[fil-1,col]=1) and (visitado[fil-1,col]=0) then
imprimirisla(A,fil-1,col,visitado);
podrian ayudarme a implementar la funcion imprimirisla que entre otras cosas es la que me permitiria imprimir la matriz de islas como la del ejemplo, se los agradeceria inmensamente.
Hola Oscar.
Respecto al programa. Antes de llegar a la cuestión del procedimiento "imprimirisla" te haré un par de comentarios.
Lo primero: este programa debería compilarte hasta "imprimirislas", ya que es algo que no has definido. Ya de antemano, te diré que lo que has escrito ahí, no compila.
Lo segundo: respecto a por qué no copila, hay fallos; no están definidas "n" y "m", te falta identificar la variable "j". A partir de ahí no he buscado más fallos.
Hablando ahora acerca de "imprimirisla": si vas a escribir en la pantalla, entonces ha de ser procedimiento, porque con las funciones NO puedes escribir. Tengo también una pregunta, el objetivo es imprimir algo parecido a un mapa, ¿verdad?
En ese caso yo escribiría un símbolo (tienes muchos para elegir) si es tierra, y nada (o un espacio) si es agua, por lo que, tal y como tienes el programa, no te haría falta un procedimiento.
Por cierto, eso de visitar, creo que no te hace falta. De hecho, ahora me estoy planteando yo dudas acerca de tu programa. ¿Cómo obtienes la matriz?
¡Saludos!
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)