Il codice
for(i=0; i<r; i++){
for(j=0; j<c; j++){
tmp=i;
i=j;
j=tmp;
a[i][j]=A[i][j];
}
}
è completamente sbagliato, inverti gli indici per entrambe le matrici. In questo modo non fai altro che ricopiare una matrice in un'altra. Infatti mi domando come tu possa affermare che
il programma funziona solo parzialmente (cioè scambia correttamente solo alcuni valori)
Se fai una prova con una matrice 3X2 dovresti avere una trasposta di 2X3, invece otterrai di nuovo una 3X2...
Mi dispiace ma sei un po' troppo lontana dalla soluzione.