codice:
#include <stdio.h>
#define BYROWS 1
#define BYCOLS 0

void Perm(int** matrix,int i,int n,int permBy);
void swap(int** matrix,int i,int j);
int main()
{
    int i,j;
    //cambiando solo questi puoi cambiare l'ordine delle matrici
    //identitā da permutare
    int nrows=3;
    int ncols=3;
    
    //allocazione dinamica matrice
    int** I = (int**)malloc(nrows * sizeof(int*));
    for(i=0;i<=nrows;i++)
    {   
        I[i]= (int*)malloc(ncols * sizeof(int));
    }
    
    //inizializzazione come matrice identitā
    for(i=0;i<nrows;i++)
            for(j=0;j<ncols;j++)
                I[i][j] = (i == j) ? 1: 0;
    printf("Per righe:\n\n");
    Perm(I,0,nrows-1,BYROWS);
    
    printf("Per colonne:\n\n");
    Perm(I,0,nrows-1,BYCOLS);
    system("PAUSE");
}

void Perm(int** matrix,int i,int n,int permBy)
{
    int j,k;
    
    if(i==n)
    {
        for(j=0;j<=n;j++)
        {   
        //basta stmapare le trasposte delle permutazioni
        //per riga per permutare per colonna
                for(k=0;k<=n;k++)
                    if(permBy = BYROWS)
                       printf("%d",matrix[j][k]);
                    else
                       printf("%d",matrix[k][j]);
                printf("\n");
        }
        printf("\n");
    }
    else
        for(j=i;j<=n;j++)
        {
                swap(matrix,i,j);
                Perm(matrix,i+1,n,permBy);
                swap(matrix,i,j); 
        }
}
//scambia due righe
void swap(int** matrix,int i,int j)
{
    int* temp;
    temp = matrix[i];
    matrix[i] = matrix[j];
    matrix[j] = temp;
}
Toh dimmi se va bene,l'ho provato due o tre volte e mi sembra che funga