[ Foro de retos de programación ]

Busqueda en n array

01-Jun-2013 14:05
Invitado (Juan)
11 Respuestas

Hola,
Necesito hacer un programa que busque en una matriz los números de 1 a n*n (no se pueden repetir los numeros)
esto es lo que tengo de momento, no se como hacer que una vez que encuentre uno pase directamente a buscar el siguiente.

 
while (k<=(sqr(n))) do 
begin
  for i:=1 to n do 
  begin
    for j:=1 to n do 
    begin
      (k=matriz[i,j])
    end;
  end;
end;
 
 



Gracias


01-Jun-2013 14:25
Nacho Cabanes (+32)

No entiendo. ¿Qué tienes que hacer con esos números? ¿decir si están o no en el array? ¿Tienes que rellenar el array con ellos?

Porque tu explicación es poco detallada, y tu fuente lee datos del array, pero no hace nada con ellos. El "while" exterior quizá fuera más simple si lo planteas como un "for". También podrías hacer el fuente más legibles si usas funciones (¿las has estudiado ya?)


01-Jun-2013 19:34
Invitado (juan)

Dada una matriz n*n solo puede estar rellenada con numeros que van del 1 a n*n y no se pueden repetir , por tanto lo que quiero es hacer que vaya buscando por todo el array esos numeros y para ver si estan todos, no se si me explico,
la idea es hacer esto en una sola funcion que devuelva un boolean
un saludo


01-Jun-2013 20:40
juan garcia

Hola, la cosa es que tengo una matriz n*n llena de numeros y quiero recorrerla entera para comprobar si estan llena de los numeros del 1 a n*n


02-Jun-2013 00:30
Nacho Cabanes (+32)

El pseudocódigo podría ser algo como

Para numero = 1 hasta n*n hacer:
-- contador = 0
-- Para fila = 1 hasta numeroDeFilas
---- Para columna = 1 hasta numeroDeColumnas
------ Si dato[fila,columna] = numero entonces
-------- Incrementar( contador )
------ Fin si
---- Fin para (columna)
-- Fin para (fila)
-- Si contador <> 1 entonces
---- Devolver Falso
-- Fin si
Fin para (numero)
Devolver Verdadero

(suponiendo que se deba devolver Falso cuando la matriz no es correcta, porque algún número exista 0 veces o más de una, y que deba devolver Verdadero cuando cada dato exista exactamente una vez).

Es decir, para cada uno de los n*n números, cuentas la cantidad de veces que aparece en el array. Si no es exactamente 1, el array no cumple la condición pedida.

Se puede plantear de otras formas más rápidas (y que a cambio consumen más memoria), pero esa es sencilla, que suele ser algo vital cuando uno empieza a programar.

Prueba a implementarla y pregunta las dudas.


02-Jun-2013 11:48
juan garcia


 
for num:=1 to n*n do begin
         contador:=0;
         for i:=1 to n do begin
             for j:=1 to n do begin
                 if mat[i,j]=num then contador:=contador+1;
             end;
         end;
         if contador<>1 then encontrado:=false;
     end;
 



{No me que da muy claro la ultima parte de devolver el verdadero}


02-Jun-2013 18:33
juan garcia

Entendido y si ahora quiero que me mire si la suma de las filas sea igual ¿como completo esto?

 
     suma:=0;
     for i:=1 to n do begin
         for j:=1 to n do begin
             suma:=suma+matriz[i,j];
         end;
         suma:=0;
     end;
 




02-Jun-2013 20:47
oscar gomez

Hola , con resècto a este ejercicio y la solucion en seudocodigo que planteas profesor tengo la duda en

que caso la matriz seria incorrecta porque algun numero exista 0 veces o mas de una, pues no se supone que al hacer el primer for numero:=1 to n*n esto no ocurriria en ningun momento, asi tampoco entiendo si el seudocodigo que planteas profesor nacho es el contenido de una funcion pues no veo parametros si no que envias directamente el resultado como si de una funcion se tratase, si pudieras profesor explicarme un poco mas mis dudas te lo agradezco inmensamente.


03-Jun-2013 19:41
Nacho Cabanes (+32)

Para Juan: el esqueleto de la suma es ese, efectivamente. Sólo te falta, para ver si todas suman lo mismo, guardar las sumas en un array, o al menos conservar la suma anterior, para comparar con ella (en tu ejemplo, calculas una única suma, que destruyes en cada pasada, sin llegar a comparar con ninguna otra).

Para Oscar: lo de "for numero:=1 to n*n" es para probar todos los números posibles, y ver si todos ellos aparecen una vez y sólo una vez. Y efectivamente, no se trata de una función completa, sólo de un esqueleto para que ayudara un poco a Juan a saber por dónde probar. Una función completa recibiría como parámetro el array que debe comprobar.


03-Jun-2013 19:57
juan garcia

¿Como la puedo comparar sin usar un array?
Gracias


06-Jun-2013 14:44
oscar gomez

cordial saludo gracias por responder, quisiera me indicaras que supongo es asi, que la matriz en mension de dimension (nxn) es una matriz dada?, siendo asi comprendo tu explicacion que me das:
Para Oscar: lo de "for numero:=1 to n*n" es para probar todos los números posibles, y ver si todos ellos aparecen una vez y sólo una vez.

Ahora bien profesor podrias indicarme un poco mejor la estructura de la funcion que mencionas y los parametros recividos por la misma?

mil gracias profesor.


06-Jun-2013 23:53
Nacho Cabanes (+32)

Nuevamente, os respondo a los dos.

Para Juan, si no quieres usar una matriz para memorizar las sumas de cada fila, necesitarás al menos una variable auxiliar llamada (por ejemplo) "sumaAnterior". En cada pasada, antes de hacer "suma=0" memorizas el valor actual para compararlo más tarde: "sumaAnterior := suma;"

Lógicamente, antes de guardar ese valor deberías haber comprobado si la suma es igual que la anterior, porque si no es así, no es necesario seguir.

if suma <> sumaAnterior then
{... avisar y terminar ...}


Para Óscar: yo también supongo que se trata de una matriz cuyo valor está dado de antes. Yo os puedo ayudar con la lógica, pero completar eso para que sea un "función real" en Pascal o en cualquier otro lenguajes... debería ser trabajo vuestro...  ;-)






(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.)