#include <stdio.h>
#define MAX_F	80
#define MAX_C	80

void imprimir_matriu(int v[MAX_F][MAX_C], int num_f, int num_c) {
	int f, c;
	for(f=0;f<num_f;f++) {
		printf("(");
		for(c=0;c<num_c;c++) {
			printf("%d ", v[f][c]);
		}
		printf(")\n");
	}
}

void swap(int *a, int *b) {
	int aux;

	aux = *a;
	*a = *b;
	*b = aux;
}

int main() {
	// int m1[MAX_F][MAX_C]={{1,0,0},{3,4,2}}, f1=2, c1=3;
	int m1[MAX_F][MAX_C]={{1,0,0},{3,4,2},{4,9,1},{6,7,3},{3,4,2}}, f1=5, c1=3;
	// int m1[MAX_F][MAX_C]={{1,0,0},{3,4,2},{4,9,1}}, f1=3, c1=3;
	int f, c;
	int mida1, mida2;

	if (f1<=c1) {
		mida1 = f1;
		mida2 = c1;
	} else {
		mida1 = c1;
		mida2 = f1;
	}

	imprimir_matriu(m1,f1,c1);
	printf("Invertir files i cols\n");
	// Invertir la matrix cuadrada mas grande de m1 que contiene la pos 0,0
	for(f=0;f<mida1;f++) {
		for(c=f+1;c<mida1;c++) {
			printf("for#1: swap (%d,%d)<->(%d,%d)\n", f, c, c, f);
			swap(&m1[f][c], &m1[c][f]);
		}
	}
	// Invertir la parte de la matriz aun no invertida
	if (f==mida2) {
		for(f=mida1;f<mida2;f++) {
			for(c=0;c<mida1;c++) {
				printf("for#2: (%d,%d)<-(%d,%d)\n", c, f, f, c);
				m1[c][f] = m1[f][c];
			}
		}
	} else {
		for(c=mida1;c<mida2;c++) {
			for(f=0;f<mida1;f++) {
				printf("for#2: (%d,%d)<-(%d,%d)\n", f, c, c, f);
				m1[f][c] = m1[c][f];
			}
		}
	}
	swap(&f1, &c1);
	imprimir_matriu(m1,f1,c1);
}

