areinverse.cpp
// $Id$
/*
COMIENZO DE DESCRIPCION
__USE_WIKI__
Dos corresponencias #M1# y #M2# son inversas una
de la otra si tienen el mismo numero de asignaciones y
para cada par de asignacion #x->y# en #M1# existe
el par #y->x# en #M2#. Escribir una funcion predicado
#bool areinverse(map<int,int> &M1,map<int,int> &M2);# que
determina si las correspondencias #M1#, #M2# son una la
inversa de la otra o no.
[Tomado en Primer Parcial 17-SET-2009].
keywords: correspondencia, lista
FIN DE DESCRIPCION */
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
#include <cstdio>
#include <cstdlib>
#include <map>
using namespace std ;
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
bool areinverse(map<int,int> &M1,map<int,int> &M2) {
// Tienen que tener la misma cantidad de asignaciones
if (M1.size()!=M2.size()) return false;
map<int,int>::iterator q1 = M1.begin(),q2;
while (q1!=M1.end()) {
int x = q1->first,
y = q1->second;
// verificar que `y' tiene un valor asignado
// y que es `x'
q2 = M2.find(y);
if (q2==M2.end() || q2->second!=x) return false;
q1++;
}
return true;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void print_map(map<int,int> &M) {
// Funcion auxiliar que imprime el map
map<int,int>::iterator q = M.begin();
while (q!=M.end()) {
printf("(%d -> %d) ",q->first,q->second);
q++;
}
printf("\n");
}
//--------------------------------------------------------------------
int main() {
map<int,int> M1,M2;
int N=10;
// Deberia retornar `true'
M1.clear();
M2.clear();
for (int j=0; j<N; j++) {
int x = j, y = (j+3)%N;
M1[x] = y;
M2[y] = x;
}
printf("M1: \n");
print_map(M1);
printf("M2: \n");
print_map(M2);
printf("are inverses ? %d\n",areinverse(M1,M2));
// Deberia retornar `false' porque
// elige un k al azar y le cambia la asignacion
// (le asigna cualquier cosa (-5))
int k = rand()%N;
M1[k] = -5;
printf("M1: \n");
print_map(M1);
printf("M2: \n");
print_map(M2);
printf("are inverses ? %d\n",areinverse(M1,M2));
// Deberia retornar `false' porque la imagen
// no tiene el mismo tamano
M1.clear();
M2.clear();
for (int j=0; j<N; j++) {
int x = j-N/2, y = x*x;
M1[x] = y;
M2[y] = x;
}
printf("M1: \n");
print_map(M1);
printf("M2: \n");
print_map(M2);
printf("are inverses ? %d\n",areinverse(M1,M2));
return 0;
}
// -----------------------------------------------------------------
Generated by GNU Enscript 1.6.6.