Función que comprueba si los elementos de una Matriz son distintos

De Ejercicios


Contenido

Enunciado

Vamos a contruir un subalgoritmo para saber si todos los elementos dentro de una matriz son distintos o no.

Soluciones

Diseño en Pseudocódigo por lperez

FUNCION Distintos(A, n): LOGICO
ENTRADAS: A: ARRAY [1..n, 1..n] DE ENTEROS; matriz cuadrada.
                     n: ENTERO, nº de filas y de columnas de A; n>0. 
SALIDAS: VERDAD si todos los elementos de A son distintos y FALSO en otro 
                 caso.
VARIABLES: i, j, k, z: ENTERO; p:LOGICO;
INICIO
  p<--VERDAD
  PARA   i<--1  HASTA  n  HACER
     PARA   j<--1  HASTA  n  HACER
        PARA   k<--1  HASTA  n  HACER
           PARA   z<--1  HASTA  n  HACER
              SI  (i<>k) OR (j<>z)
              ENTONCES
                 SI A(i,j)=A(k,z)
                 ENTONCES 
                    p<-- FALSO
                 FIN_SI
              FIN_SI
           FIN_PARA
        FIN_PARA
     FIN_PARA
  FIN_PARA
  DEVOLVER VERDAD
FIN

Programa en C

 int Distintos(int A[1000][1000], int n){
    /*VARIABLES*/
    int i,j,k,z;
    int p;
    
    /*INCIO*/
    p=1;  //Verdad.
    for(i=1; i<=n; i++){
         for(j=1; j<=n; j++){
                  for(k=1; k<=n; k++){
                         for(z=1; z<=n; z++){
                                  if ((i!=k)||(j!=z)){
                                         if(A[i][j]==A[k][z]){
                                                  p=0;  //Falso.
                                         }
                                  }
                         }
                  }
         }
    }  
    return p;
 }

Comentario

Los arrays en C deben tener un tamaño fijo, por eso se ha optado por darles una tamaño de 1000. Si dicho tamaño no es suficiente debe cambiarse por otro superior.


Diseño en Pseudocódigo por lperez

FUNCION Distintos(A, n): LOGICO
ENTRADAS: A: ARRAY [1..n, 1..n] DE ENTEROS; matriz cuadrada.
                     n: ENTERO, nº de filas y de columnas de A; n>0. 
SALIDAS: VERDAD si todos los elementos de A son distintos y FALSO en otro 
                 caso.
VARIABLES: i, j, fila, columna: ENTERO; p: LOGICO.
INICIO
  p<--VERDAD
  i<--1
  MIENTRAS (i<= n) AND p  HACER
     j<--1
     MIENTRAS (j<= n) AND p HACER
        SI  j=n
        ENTONCES
           fila<--i+1
           columna<--1
        SI NO
        fila<--i
        columna<--j+1
        FIN_SI
        MIENTRAS  (fila<= n) AND p  HACER
           MIENTRAS  (columna<= n) AND p  HACER
              SI A(i,j)=A(fila, columna)
              ENTONCES
                 p<--FALSO
              FIN_SI
              columna<--columna+1
           FIN_MIENTRAS
           fila<--fila+1
           columna<--1
        FIN_MIENTRAS
        j<--j+1	
     FIN_MIENTRAS
     i<--i+1
  FIN_MIENTRAS
  DEVOLVER p
FIN

Comentario

En la primera solución se compara un elemento con todos los de la martriz, incluido el mismo, por lo que tenemos que comprobar que si es con él mismo no debemos tener en cuenta la comparación. En la segunda cada elemento de la matriz no se compara con todos sino sólo con aquellos elementos siguientes a él.

Programa en Pascal por lperez

Function Distintos(var a:matriz;t:integer):boolean;
(* Entradas: a,una matriz y t su tama¤o
  Salidas: verdadero si todos los elementos de la matriz son distintos y
           falso en otro caso *)
var  i,j,k,z:integer;
    p:boolean;
begin
 p:=true;
 for i:=1 to t do
   for j:=1 to t do
     for k:=1 to t do
       for z:=1 to t do
         if (i<>k) or (j<>z)
         then
           if a[i,j]=a[k,z]
           then p:=false;
 Distintos:=p;
end;

Programa en Pascal por lperez

Function Distin2(var a:matriz;t:integer):boolean;
(* Entradas: a,una matriz y t su tama¤o
  Salidas: verdadero si todos los elementos de la matriz son distintos y
           falso en otro caso *)
var  i,j,k,z,fila,col:integer;
    p:boolean;
begin
 p:=true;
 for i:=1 to t do
   for j:=1 to t do
     begin
       if j=t
       then
         begin
           fila:=i+1;
           col:=1;
         end
       else
         begin
           fila:=i;
           col:=j+1;
         end;
       k:=fila;
       z:=col;
       while k<=t do
         begin
           while z<=t do
             begin
               if a[i,j]=a[k,z]
               then p:=false;
               z:=z+1;
             end;
           z:=1;
           k:=k+1;
         end;
     end;
 Distin2:=p;
end;

Comentario

En las funciones anteriores hemos utilizado el tipo martiz, que debe estar declarado en la sección type del programa principal. Por ejemplo type matriz=array[1..10,1..10] of integer;

Tipos de soluciones