Io sfrutterei la map.
Spero che non verrò tritato dagli utenti esperti per l'algoritmo che sto per proporre, ma la map ha una caratteristica interessante.
Quando accedi ad una chiave che non esiste, la crea e inizializza il valore con il suo default.
Perciò, quando dichiari una map<int,int> (chiave intera, valori interi) e provi ad accedere alla map con una chiave che non esiste, il valore corrispondente viene creato col costruttore di default, che per gli interi è int(0).
Quindi ti basta fare un ciclo che scorra tutta la matrice, e ad ogni elemento della matrice incrementare il suo contatore, così:
Una volta che hai scorso la matrice, avrai come chiavi della mappa tutti i numeri presenti nella matrice e come valori il numero di volte che ognuno di questi appare nella matrice.codice:mappa_contatori[ matrice[i][j] ] += 1;
A questo punto ti basta cercare la chiave a cui è associato il valore più grande.