Supongo que con este te irá bien.
Va comprobando desde la primera hasta la penúltima columna si las siguientes son iguales a ellas. En cuánto detecta que dos elementos no son iguales va no pierde más tiempo y va a buscar la siguiente columna. Si detecta que dos columnas son iguales se detiene e informa de ello.
Hay que usar stdbool, pero se puede cambiar el bool por int y true y false por 1 y 0 respectivamente.
bool columnas_iguales(int matriz[][COLUMNAS]) {
bool retval = false;
for(int i=0; !retval && i<COLUMNAS-1; ++i) {
for(int j=i+1; !retval && j<COLUMNAS; ++j) {
int m;
for(m=0; m<FILAS; ++m) {
if(matriz[m][i]!=matriz[m][j])
break;
}
if(m==FILAS)
retval = true;
}
}
return retval;
}
Por lo que yo tengo entendido no es muy recomendable usar instrucciones como <break> (excepto en un <switch>), <goto>, etc. Entonces se puede conseguir lo mismo usando la propia variable <retval>. Supones que son iguales y cuando dos valores no coincidan, dejan de ser iguales. Quedaría así:
bool columnas_iguales(int matriz[][COLUMNAS]) {
bool retval = false;
for(int i=0; !retval && i<COLUMNAS-1; ++i) {
for(int j=i+1; !retval && j<COLUMNAS; ++j) {
retval = true;
for(int m=0; retval && m<FILAS; ++m)
if(matriz[m][i]!=matriz[m][j])
retval = false;
}
return retval;
}
A esto me refería cuando al principio le comenté a Hackersanfe que intentará hacerlo sin el array auxiliar.
PD: No sabía que para usar el tipo de dato <bool> en C se podía hacer con <stdbool>. Yo creaba una enumeración para poder usarlo. Algo así:
typedef enum {false, true} bool;