#include <stdio.h>
#include <conio.h>


float subMatrix(float *mat, int nSize);
void copySubMatrix(float *oMat, float *iMat, int nSize, int posM, int posN);
float result[16];

#define N_SIZE 4

int main(void)
{
	float mat[N_SIZE][N_SIZE]={
				1,2,3,4,
				3,6,7,8,
				1,3,3,5,
				5,6,9,8
				};
				
	float *MatIn = &mat[0][0];
	float result[N_SIZE][N_SIZE];
	
	float det = 0;	
	
	int i, j, nSize = N_SIZE;
	
	for(i=0; i<nSize; ++i)
	{
		for(j=0; j<nSize; ++j)
		{
			float *p_Copy = new float[(nSize-1)*(nSize-1)];
			copySubMatrix(p_Copy, MatIn, nSize, i, j);
			if((i+j)%2)	result[i][j] = 0 - subMatrix(p_Copy, nSize-1);
			else		result[i][j] = subMatrix(p_Copy, nSize-1);
			delete [] p_Copy;
		}
	}
	
	for(i=0; i<nSize; ++i)
	{
		det +=result[0][i] *  mat[0][i];
		printf("det = %f\n", det);
	}
	if(det)
	{
		for(i=0; i<nSize; ++i)
		{
			for(j=0; j<nSize; ++j)
			{
				printf("%.2f\t", result[j][i]/det);
			}
			printf("\n");
		}
	}
	
	
	


	getch();
	return 0;
}

//get det(mat)
float subMatrix(float *mat, int nSize)
{
	int i,j;
	float det = 0;
	if(nSize==2)
	{
		printf("%.1f * %.1f - %.1f * %.1f =%.1f \n",mat[0] , mat[3], mat[1], mat[2] ,mat[0] * mat[3] - mat[1] * mat[2]);
		return mat[0] * mat[3] - mat[1] * mat[2];
	}
	
	//else case
	for(i=0; i<nSize; ++i)
	{
		for(j=0; j<nSize; ++j)
		{
			float *p_Copy = new float[(nSize-1)*(nSize-1)];
			copySubMatrix(p_Copy, mat, nSize, i, j);
			if((i+j)%2)	det -= mat[(i*nSize+j)]* subMatrix(p_Copy, nSize-1);
			else		det += mat[(i*nSize+j)]* subMatrix(p_Copy, nSize-1);
			delete [] p_Copy;
			
		}
	}
	return det;
	
}

void copySubMatrix(float *oMat, float *iMat, int nSize, int posM, int posN)
{
	int i,j,oIndex = 0, iIndex;

	for(i=0; i<nSize-1; ++i)
	{
		for(j=0; j<nSize-1; ++j)
		{
			iIndex = (i<posM)? i*nSize : (i+1)*nSize;
			iIndex += (j<posN)? j: (j+1);
			oMat[oIndex] = iMat[iIndex];

			printf("%.1f\t", oMat[oIndex]);
			oIndex++;
		}
		printf("\n");
	}
	printf("\n");
//	getch();
}


