#include <stdio.h>
#include <stdlib.h>

int Determinante(int **matrice, int N);
int **CreaMatrice(int dimensione);
int **CreaRidotta(int **matrice,int **matrice_rid,int N,int c);

int main()
{
    FILE *fp;
    char temp[256];
    int **matrice;
    int t, i, N=0;
    int determinante;

    if((fp=fopen("matrice.txt","r"))==NULL){
        fprintf(stderr,"Yeuch! Errore nell'apertura del file.");
        exit (10);
    }

    while(fgets(temp,256,fp)!=NULL) N++;
    printf("Ho letto una matrice di ordine %d.\n",N);
    rewind(fp);

    matrice=CreaMatrice(N);

    for(t=0;t<N;t++){
        for(i=0;i<N;i++){
            fscanf(fp,"%d",&matrice[t][i]);
            printf("%d ",matrice[t][i]);
        }
        printf("\n");
    }

    determinante=Determinante(matrice,N);

    printf("\nIl determinante della matrice e' %d.\n",determinante);

	return 0;
}

int **CreaMatrice(int dimensione)
{
    int **matrice;
    int t;

    matrice=(int **)malloc(dimensione*sizeof(int *));
    for(t=0;t<dimensione;t++){
        matrice[t]=(int *)malloc(dimensione*sizeof(int));
    }

    return matrice;
}

int **CreaRidotta(int **matrice,int **matrice_rid,int N,int c)
{
    int i, j, k;

    for(i=1;i<N;i++){
        k=0;
        for(j=0;j<N;j++){
            if(j!=c){
                matrice_rid[i-1][k++]=matrice[i][j];
            }
        }
    }
}

int Determinante(int **matrice, int N)
{
    int i=0, j=0;
    int **matrice_rid;
    int determinante;
    int segno=1;
    int delta=0;

    if(N==1) return matrice[0][0];
    else {
        matrice_rid=CreaMatrice(N-1);
        for(i=0;i<N;i++){
            CreaRidotta(matrice,matrice_rid,N,i);
            determinante=Determinante(matrice_rid,N-1);
            delta += segno*matrice[0][i]*determinante;
            segno = -segno;
        }
    }

    return delta;
}
